gpt4 book ai didi

java - Mockito 测试框架

转载 作者:行者123 更新时间:2023-12-01 04:10:53 25 4
gpt4 key购买 nike

晚上好,第一次面对模拟对象,我尝试测试我的应用程序,但什么也没发生。我应该测试 ATM 的工作情况。我有 2 个未实现的接口(interface)(帐户和卡)和一个类。ATM(有空方法)。我的任务也是在 ATM 类中实现方法。但不改变方法。

这是我的代码,无法测试。

1)接口(interface)卡:

    package myatm;
public interface Card {
public boolean isBlocked(); // checks whther card is blocked or not
public Account getAccount(); // returns the balance connected with this card
public boolean checkPin(int pinCode); // checks the property of password
}

2)接口(interface)帐户:

  package myatm;
public interface Account {
public double getBalance(); // returns current balance
public double withdrow(double amount); // returns the sum which was taken.
}

3)ATM 类:

 package myatm;
public class ATM {
public double money;

ATM(double moneyInATM){ //we can set up the number of money in ATM
money=moneyInATM;

}


public void setATM (ATM atm){
this.atm =atm;
}


public double getMoneyInATM() { //
return atm.checkBalance();
}
// checks pin code and card status(blocked or not)
// if blocked should send exception
// if pin is not correct should send exception too
public boolean validateCard(Card card, int pinCode){
boolean ret = false;
if ((card.checkPin(pinCode)==false) && (card.isBlocked()==false)){
ret=false;
}
else {
if((card.checkPin(pinCode)==true) && (card.isBlocked()==true))
ret = true;
}
return ret; }
Account acc = null;
//returns the total ammount of money
public double checkBalance(){
return acc.getBalance();
}
ATM atm = new ATM(10500);
// method which is taking money from the account.
//Should check if sum is less then money in atm
public double getCash(double amount){
double sum=amount;
if(atm.checkBalance()>acc.getBalance()){
sum=(acc.getBalance()-sum);
}
else if(atm.checkBalance()<acc.getBalance()){
throw new IllegalArgumentException("Not enough money in ATM");
}
else if (sum>acc.getBalance()){
throw new UnsupportedOperationException("Not enought money on your account");

}
return sum;
}}

4)MyATM 类:

 package myatm;

public class MyATM {

public static void main(String[] args) {
double moneyInATM = 1000;
ATM atm = new ATM(moneyInATM);
Card card = null;
atm.validateCard(card, 1234);
atm.checkBalance();
atm.getCash(999.99);
}
}

这是我尝试为一种方法编写的测试,但它不起作用。请尝试让我了解我做错了什么。

5) 包含 Mockito 的类:

 package myatm;

import static java.util.jar.Pack200.Packer.TRUE;
import static org.mockito.Mockito.*;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;



public class ATMtest {
ATM atm;
@Before
public void setup(){
Card card =mock(Card.class);
Account acc = mock(Account.class);
when(card.isBlocked()).thenReturn(Boolean.FALSE);
when(card.checkPin(1234)).thenReturn(Boolean.TRUE);

atm.setATM(atm);

atm = new ATM(1500);
}

@Test
public void setBalance (double x){
Assert.assertEquals(x, atm.checkBalance());
}


}

最佳答案

我让您的代码正常工作,但进行了以下更新:

  • 从测试方法中删除了参数(@Test
    public void setBalance(double x)
    )。
  • 向 ATM 类添加了 getter/setter,因为它们用于测试和良好实践。
  • 添加了 Junit 运行器注释@RunWith(PowerMockRunner.class)
  • 以及以下工作代码中显示的其他更新。

ATMtest.java:

package myatm;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
public class ATMtest {

// Class Under Test
ATM atm;

@Before
public void setup() {
Card card = mock(Card.class);
Account acc = mock(Account.class);
when(card.isBlocked()).thenReturn(Boolean.FALSE);
when(card.checkPin(1234)).thenReturn(Boolean.TRUE);
when(acc.getBalance()).thenReturn((double) 1);
atm = new ATM(1500);
atm.setAcc(acc);
}

@Test
public void testCheckBalance() {

/* Test */
double result = atm.checkBalance();

/* Asserts */
Assert.assertEquals((double) 1, result, .001);
}

}

MyATM.java:

package myatm;

public class MyATM {

public static void main(String[] args) {
double moneyInATM = 1000;
ATM atm = new ATM(moneyInATM);
Card card = null;
atm.validateCard(card, 1234);
atm.checkBalance();
atm.getCash(999.99);
}
}

ATM.java:

package myatm;

public class ATM {
public double money;

ATM(double moneyInATM) { // we can set up the number of money in ATM
money = moneyInATM;

}

// checks pin code and card status(blocked or not)
// if blocked should send exception
// if pin is not correct should send exception too
public boolean validateCard(Card card, int pinCode) {
boolean ret = false;
if ((card.checkPin(pinCode) == false) && (card.isBlocked() == false)) {
ret = false;
} else {
if ((card.checkPin(pinCode) == true) && (card.isBlocked() == true))
ret = true;
}
return ret;
}

Account acc = null;

// returns the total ammount of money
public double checkBalance() {
return acc.getBalance();
}

public double getMoney() {
return money;
}

public void setMoney(double money) {
this.money = money;
}

public Account getAcc() {
return acc;
}

public void setAcc(Account acc) {
this.acc = acc;
}

// method which is taking money from the account.
// Should check if sum is less then money in atm
public double getCash(double amount) {
double sum = amount;
if (this.checkBalance() > acc.getBalance()) {
sum = (acc.getBalance() - sum);
} else if (this.checkBalance() < acc.getBalance()) {
throw new IllegalArgumentException("Not enough money in ATM");
} else if (sum > acc.getBalance()) {
throw new UnsupportedOperationException(
"Not enought money on your account");

}
return sum;
}
}

Account.java:

package myatm;

public interface Account {
public double getBalance(); // returns current balance

public double withdrow(double amount); // returns the sum which was taken.
}

测试结果:

enter image description here

关于java - Mockito 测试框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com