Commit 63fb538d authored by Bhargava Rellu's avatar Bhargava Rellu

Assertions and Assumptions

parent ad9c65d5
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Gradle Imported" enabled="true">
<outputRelativeToContentRoot value="true" />
<processorPath useClasspath="false">
<entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.projectlombok/lombok/1.18.24/13a394eed5c4f9efb2a6d956e2086f1d81e857d9/lombok-1.18.24.jar" />
</processorPath>
<module name="JUnit.main" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel target="11" />
</component>
</project>
\ No newline at end of file
......@@ -3,6 +3,8 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="delegatedBuild" value="true" />
<option name="testRunner" value="PLATFORM" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="C:/gradle-7.4.2" />
......
## Testing
1. Unit Testing -> testing small pieces of code
2. System Testing -> testing a bigger part, like complete api
3. Integration Testing -> testing different parts and how they work together
4. Acceptance Testing -> check with the end users whether they are capable of using software
5. Performance Testing -> evaluates the speed, responsiveness and stability
6. Regression Testing -> testing again complete code when ever changes were made
7. Security Testing -> spots weaknesses in the security of the system
8. Load Testing -> testing with huge load of traffic at the same time
9. End-to-end Testing -> Testing application as a whole
### TDD (Test Driven Development)
- Write test before implementation of code
- Forces the developer to think about the requirements before implementation
- Tests are not skipped due to time pressure
- Bugs are spotted early
*TDD steps*
1. Write failing tests
2. Implement code that makes the test pass
3. Refactoring
### Advantages
- validate small units of software
- find bugs easy and early
- save time and money
- can force developers to write better and cleaner code
## JUnit
- Unit testing framework for Java
- Part of the xUnit series where JUnit is for Java
- Enables automated unit testing
- Must-have for TDD
......@@ -10,9 +10,12 @@ repositories {
}
dependencies {
implementation 'org.apache.groovy:groovy:4.0.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
implementation 'org.apache.groovy:groovy:4.0.3'
implementation 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
implementation 'net.datafaker:datafaker:1.4.0'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
}
test {
......
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Class CalculateMethodsTest</title>
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
<script src="../js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Class CalculateMethodsTest</h1>
<div class="breadcrumbs">
<a href="../index.html">all</a> &gt;
<a href="../packages/default-package.html">default-package</a> &gt; CalculateMethodsTest</div>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">1</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.026s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Tests</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Tests</h2>
<table>
<thead>
<tr>
<th>Test</th>
<th>Method name</th>
<th>Duration</th>
<th>Result</th>
</tr>
</thead>
<tr>
<td class="success">test divide</td>
<td class="success">testDivide()</td>
<td class="success">0.026s</td>
<td class="success">passed</td>
</tr>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 7.4</a> at Jul 16, 2022, 10:31:50 PM</p>
</div>
</div>
</body>
</html>
body {
margin: 0;
padding: 0;
font-family: sans-serif;
font-size: 12pt;
}
body, a, a:visited {
color: #303030;
}
#content {
padding-left: 50px;
padding-right: 50px;
padding-top: 30px;
padding-bottom: 30px;
}
#content h1 {
font-size: 160%;
margin-bottom: 10px;
}
#footer {
margin-top: 100px;
font-size: 80%;
white-space: nowrap;
}
#footer, #footer a {
color: #a0a0a0;
}
#line-wrapping-toggle {
vertical-align: middle;
}
#label-for-line-wrapping-toggle {
vertical-align: middle;
}
ul {
margin-left: 0;
}
h1, h2, h3 {
white-space: nowrap;
}
h2 {
font-size: 120%;
}
ul.tabLinks {
padding-left: 0;
padding-top: 10px;
padding-bottom: 10px;
overflow: auto;
min-width: 800px;
width: auto !important;
width: 800px;
}
ul.tabLinks li {
float: left;
height: 100%;
list-style: none;
padding-left: 10px;
padding-right: 10px;
padding-top: 5px;
padding-bottom: 5px;
margin-bottom: 0;
-moz-border-radius: 7px;
border-radius: 7px;
margin-right: 25px;
border: solid 1px #d4d4d4;
background-color: #f0f0f0;
}
ul.tabLinks li:hover {
background-color: #fafafa;
}
ul.tabLinks li.selected {
background-color: #c5f0f5;
border-color: #c5f0f5;
}
ul.tabLinks a {
font-size: 120%;
display: block;
outline: none;
text-decoration: none;
margin: 0;
padding: 0;
}
ul.tabLinks li h2 {
margin: 0;
padding: 0;
}
div.tab {
}
div.selected {
display: block;
}
div.deselected {
display: none;
}
div.tab table {
min-width: 350px;
width: auto !important;
width: 350px;
border-collapse: collapse;
}
div.tab th, div.tab table {
border-bottom: solid #d0d0d0 1px;
}
div.tab th {
text-align: left;
white-space: nowrap;
padding-left: 6em;
}
div.tab th:first-child {
padding-left: 0;
}
div.tab td {
white-space: nowrap;
padding-left: 6em;
padding-top: 5px;
padding-bottom: 5px;
}
div.tab td:first-child {
padding-left: 0;
}
div.tab td.numeric, div.tab th.numeric {
text-align: right;
}
span.code {
display: inline-block;
margin-top: 0em;
margin-bottom: 1em;
}
span.code pre {
font-size: 11pt;
padding-top: 10px;
padding-bottom: 10px;
padding-left: 10px;
padding-right: 10px;
margin: 0;
background-color: #f7f7f7;
border: solid 1px #d0d0d0;
min-width: 700px;
width: auto !important;
width: 700px;
}
span.wrapped pre {
word-wrap: break-word;
white-space: pre-wrap;
word-break: break-all;
}
label.hidden {
display: none;
}
\ No newline at end of file
#summary {
margin-top: 30px;
margin-bottom: 40px;
}
#summary table {
border-collapse: collapse;
}
#summary td {
vertical-align: top;
}
.breadcrumbs, .breadcrumbs a {
color: #606060;
}
.infoBox {
width: 110px;
padding-top: 15px;
padding-bottom: 15px;
text-align: center;
}
.infoBox p {
margin: 0;
}
.counter, .percent {
font-size: 120%;
font-weight: bold;
margin-bottom: 8px;
}
#duration {
width: 125px;
}
#successRate, .summaryGroup {
border: solid 2px #d0d0d0;
-moz-border-radius: 10px;
border-radius: 10px;
}
#successRate {
width: 140px;
margin-left: 35px;
}
#successRate .percent {
font-size: 180%;
}
.success, .success a {
color: #008000;
}
div.success, #successRate.success {
background-color: #bbd9bb;
border-color: #008000;
}
.failures, .failures a {
color: #b60808;
}
.skipped, .skipped a {
color: #c09853;
}
div.failures, #successRate.failures {
background-color: #ecdada;
border-color: #b60808;
}
ul.linkList {
padding-left: 0;
}
ul.linkList li {
list-style: none;
margin-bottom: 5px;
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Test Summary</title>
<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="css/style.css" rel="stylesheet" type="text/css"/>
<script src="js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Test Summary</h1>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">1</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.026s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Packages</a>
</li>
<li>
<a href="#tab1">Classes</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Packages</h2>
<table>
<thead>
<tr>
<th>Package</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thead>
<tbody>
<tr>
<td class="success">
<a href="packages/default-package.html">default-package</a>
</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.026s</td>
<td class="success">100%</td>
</tr>
</tbody>
</table>
</div>
<div id="tab1" class="tab">
<h2>Classes</h2>
<table>
<thead>
<tr>
<th>Class</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thead>
<tbody>
<tr>
<td class="success">
<a href="classes/CalculateMethodsTest.html">CalculateMethodsTest</a>
</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.026s</td>
<td class="success">100%</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 7.4</a> at Jul 16, 2022, 10:31:50 PM</p>
</div>
</div>
</body>
</html>
(function (window, document) {
"use strict";
var tabs = {};
function changeElementClass(element, classValue) {
if (element.getAttribute("className")) {
element.setAttribute("className", classValue);
} else {
element.setAttribute("class", classValue);
}
}
function getClassAttribute(element) {
if (element.getAttribute("className")) {
return element.getAttribute("className");
} else {
return element.getAttribute("class");
}
}
function addClass(element, classValue) {
changeElementClass(element, getClassAttribute(element) + " " + classValue);
}
function removeClass(element, classValue) {
changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
}
function initTabs() {
var container = document.getElementById("tabs");
tabs.tabs = findTabs(container);
tabs.titles = findTitles(tabs.tabs);
tabs.headers = findHeaders(container);
tabs.select = select;
tabs.deselectAll = deselectAll;
tabs.select(0);
return true;
}
function getCheckBox() {
return document.getElementById("line-wrapping-toggle");
}
function getLabelForCheckBox() {
return document.getElementById("label-for-line-wrapping-toggle");
}
function findCodeBlocks() {
var spans = document.getElementById("tabs").getElementsByTagName("span");
var codeBlocks = [];
for (var i = 0; i < spans.length; ++i) {
if (spans[i].className.indexOf("code") >= 0) {
codeBlocks.push(spans[i]);
}
}
return codeBlocks;
}
function forAllCodeBlocks(operation) {
var codeBlocks = findCodeBlocks();
for (var i = 0; i < codeBlocks.length; ++i) {
operation(codeBlocks[i], "wrapped");
}
}
function toggleLineWrapping() {
var checkBox = getCheckBox();
if (checkBox.checked) {
forAllCodeBlocks(addClass);
} else {
forAllCodeBlocks(removeClass);
}
}
function initControls() {
if (findCodeBlocks().length > 0) {
var checkBox = getCheckBox();
var label = getLabelForCheckBox();
checkBox.onclick = toggleLineWrapping;
checkBox.checked = false;
removeClass(label, "hidden");
}
}
function switchTab() {
var id = this.id.substr(1);
for (var i = 0; i < tabs.tabs.length; i++) {
if (tabs.tabs[i].id === id) {
tabs.select(i);
break;
}
}
return false;
}
function select(i) {
this.deselectAll();
changeElementClass(this.tabs[i], "tab selected");
changeElementClass(this.headers[i], "selected");
while (this.headers[i].firstChild) {
this.headers[i].removeChild(this.headers[i].firstChild);
}
var h2 = document.createElement("H2");
h2.appendChild(document.createTextNode(this.titles[i]));
this.headers[i].appendChild(h2);
}
function deselectAll() {
for (var i = 0; i < this.tabs.length; i++) {
changeElementClass(this.tabs[i], "tab deselected");
changeElementClass(this.headers[i], "deselected");
while (this.headers[i].firstChild) {
this.headers[i].removeChild(this.headers[i].firstChild);
}
var a = document.createElement("A");
a.setAttribute("id", "ltab" + i);
a.setAttribute("href", "#tab" + i);
a.onclick = switchTab;
a.appendChild(document.createTextNode(this.titles[i]));
this.headers[i].appendChild(a);
}
}
function findTabs(container) {
return findChildElements(container, "DIV", "tab");
}
function findHeaders(container) {
var owner = findChildElements(container, "UL", "tabLinks");
return findChildElements(owner[0], "LI", null);
}
function findTitles(tabs) {
var titles = [];
for (var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
var header = findChildElements(tab, "H2", null)[0];
header.parentNode.removeChild(header);
if (header.innerText) {
titles.push(header.innerText);
} else {
titles.push(header.textContent);
}
}
return titles;
}
function findChildElements(container, name, targetClass) {
var elements = [];
var children = container.childNodes;
for (var i = 0; i < children.length; i++) {
var child = children.item(i);
if (child.nodeType === 1 && child.nodeName === name) {
if (targetClass && child.className.indexOf(targetClass) < 0) {
continue;
}
elements.push(child);
}
}
return elements;
}
// Entry point.
window.onload = function() {
initTabs();
initControls();
};
} (window, window.document));
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
<title>Test results - Default package</title>
<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
<link href="../css/style.css" rel="stylesheet" type="text/css"/>
<script src="../js/report.js" type="text/javascript"></script>
</head>
<body>
<div id="content">
<h1>Default package</h1>
<div class="breadcrumbs">
<a href="../index.html">all</a> &gt; default-package</div>
<div id="summary">
<table>
<tr>
<td>
<div class="summaryGroup">
<table>
<tr>
<td>
<div class="infoBox" id="tests">
<div class="counter">1</div>
<p>tests</p>
</div>
</td>
<td>
<div class="infoBox" id="failures">
<div class="counter">0</div>
<p>failures</p>
</div>
</td>
<td>
<div class="infoBox" id="ignored">
<div class="counter">0</div>
<p>ignored</p>
</div>
</td>
<td>
<div class="infoBox" id="duration">
<div class="counter">0.026s</div>
<p>duration</p>
</div>
</td>
</tr>
</table>
</div>
</td>
<td>
<div class="infoBox success" id="successRate">
<div class="percent">100%</div>
<p>successful</p>
</div>
</td>
</tr>
</table>
</div>
<div id="tabs">
<ul class="tabLinks">
<li>
<a href="#tab0">Classes</a>
</li>
</ul>
<div id="tab0" class="tab">
<h2>Classes</h2>
<table>
<thread>
<tr>
<th>Class</th>
<th>Tests</th>
<th>Failures</th>
<th>Ignored</th>
<th>Duration</th>
<th>Success rate</th>
</tr>
</thread>
<tr>
<td class="success">
<a href="../classes/CalculateMethodsTest.html">CalculateMethodsTest</a>
</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0.026s</td>
<td class="success">100%</td>
</tr>
</table>
</div>
</div>
<div id="footer">
<p>
<div>
<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
</label>
</div>Generated by
<a href="http://www.gradle.org">Gradle 7.4</a> at Jul 16, 2022, 10:31:50 PM</p>
</div>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="CalculateMethodsTest" tests="1" skipped="0" failures="0" errors="0" timestamp="2022-07-16T17:01:50" hostname="HYD-LAP-00433" time="0.026">
<properties/>
<testcase name="test divide" classname="CalculateMethodsTest" time="0.026"/>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[]]></system-err>
</testsuite>
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BankAccount {
private Double balance;
private Double minimumBalance;
private Boolean active = true;
private String holderName;
public Double withDraw(Double amount) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (balance - amount > minimumBalance) {
balance -= amount;
return amount;
} else {
throw new RuntimeException();
}
}
public double deposit(double amount) {
return balance += amount;
}
}
public class CalculateMethods {
public double divide(int x, int y) {
return x / y;
}
}
public class Code {
public String sayHello() {
return "Hello World";
}
}
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
class BankAccountAssumptionsTest {
@Test
@DisplayName("test activation account after creation")
void testActive() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.active(true)
.minimumBalance(-1000.00).build();
// assumeFalse(bankAccount == null, "Account is null");
assumingThat(bankAccount != null, () -> assertTrue(bankAccount.getActive()));
}
}
\ No newline at end of file
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class BankAccountNestedTest {
@Test
@DisplayName("Withdraw 500 successfully")
void testWithdraw() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.minimumBalance(-1000.00).build();
bankAccount.withDraw(300.00);
assertEquals(200, bankAccount.getBalance());
}
@Test
@DisplayName("Deposit 400 successfully")
void testDeposit() {
BankAccount bankAccount = BankAccount.builder()
.balance(400.00)
.minimumBalance(0.00).build();
bankAccount.deposit(500);
assertEquals(900.00, bankAccount.getBalance());
}
@Nested
class WhenBalanceEqualsZero {
@Test
@DisplayName("test withdraw minimum balance is 0")
void testWithdrawMinimumBalanceIs0() {
BankAccount bankAccount = BankAccount.builder()
.balance(0.00)
.minimumBalance(0.00).build();
assertThrows(RuntimeException.class, () -> bankAccount.withDraw(500.00));
}
@Test
@DisplayName("test withdraw minimum balance negative 1000")
void testWithdrawMinimumBalanceNegative1000() {
BankAccount bankAccount = BankAccount.builder()
.balance(0.00)
.minimumBalance(-1000.00).build();
bankAccount.withDraw(500.00);
assertEquals(-500.00, bankAccount.getBalance());
}
}
}
\ No newline at end of file
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class BankAccountOrderedExecutionTest {
static BankAccount bankAccount = BankAccount.builder()
.balance(0.00)
.minimumBalance(0.00).build();
@Test
@Order(2)
@DisplayName("test withdraw")
void testWithdraw() {
bankAccount.withDraw(300.00);
assertEquals(200.00, bankAccount.getBalance());
}
@Test
@Order(1)
@DisplayName("test deposit")
void testDeposit() {
bankAccount.deposit(500.00);
assertEquals(500, bankAccount.getBalance());
}
}
\ No newline at end of file
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.*;
@DisplayName("Test Bank account class")
class BankAccountTest {
@Test
@DisplayName("Withdraw 500 successfully")
void testWithdraw() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.minimumBalance(-1000.00).build();
bankAccount.withDraw(300.00);
assertEquals(200, bankAccount.getBalance());
}
@Test
@DisplayName("Deposit 400 successfully")
void testDeposit() {
BankAccount bankAccount = BankAccount.builder()
.balance(400.00)
.minimumBalance(0.00).build();
bankAccount.deposit(500);
assertEquals(900.00, bankAccount.getBalance());
}
@Test
@DisplayName("Withdraw will become negative")
void testWithdrawNotStuckAtZero() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.minimumBalance(-1000.00).build();
bankAccount.withDraw(800.00);
assertNotEquals(0, bankAccount.getBalance());
}
@Test
@DisplayName("Test activation account after creation")
void testActive() {
BankAccount bankAccount = BankAccount.builder()
.balance(400.00)
.minimumBalance(0.00)
.active(true).build();
assertTrue(bankAccount.getActive());
}
@Test
@DisplayName("test holder name set")
void testHolderNameSet() {
BankAccount bankAccount = BankAccount.builder()
.balance(400.00)
.minimumBalance(0.00)
.active(true).build();
assertNull(bankAccount.getHolderName());
bankAccount.setHolderName("Bhargava");
assertNotNull(bankAccount.getHolderName());
}
@Test
@DisplayName("test no withdraw below minimum")
void testNoWithdrawBelowMinimum() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.minimumBalance(-1000.00).build();
assertThrows(RuntimeException.class, () -> bankAccount.withDraw(2000.00));
}
@Test
@DisplayName("test withdraw and deposit without exceptions")
void testWithdrawAndDepositWithoutExceptions() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.minimumBalance(-1000.00).build();
assertAll(() -> bankAccount.deposit(200),
() -> bankAccount.withDraw(300.00));
}
@Test
@DisplayName("test deposit timeout")
void testDepositTimeout() {
BankAccount bankAccount = BankAccount.builder()
.balance(500.00)
.minimumBalance(-1000.00).build();
assertTimeout(Duration.ofMillis(6), () -> bankAccount.withDraw(250.00));
assertEquals(0.33, Double.valueOf((1.00 / 3.00)), 0.0033333333333333);
}
}
\ No newline at end of file
import org.junit.jupiter.api.*;
class CalculateMethodsTest {
private CalculateMethods calculateMethods;
@BeforeEach
void setUp() {
calculateMethods = new CalculateMethods();
}
@Test
@DisplayName("test divide")
void testDivide() {
Assertions.assertEquals(10, calculateMethods.divide(100, 10));
}
@Test
@DisplayName("test divide by zero")
void testDivideByZero() {
Assertions.assertThrows(ArithmeticException.class, () -> calculateMethods.divide(100, 0));
}
@AfterEach
void tearDown() {
calculateMethods = null;
}
}
\ No newline at end of file
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CodeTest {
@Test
@DisplayName("test say hello")
void testSayHello() {
Code code = new Code();
assertEquals("Hello World", code.sayHello());
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment