如何为另一个方法内部的方法调用编写Junit


public class Account{
public String getAcctNo(int accno){
String cardno = getcreditCard();
return accno + ":" + cardno;
}
public String creditCard(){
Random rand = new Random();
int one = rand.nextInt(1000);
int two = rand.nextInt(1000);
int three = rand.nextInt(1000);
int four = rand.nextInt(1000);
return one + "-" + two + "-" + three + "-" + four;
}
}   

我正在编写下面这样的单元测试,但我认为我们应该在没有mock的情况下编写。

public class AccountDetailsTestCase {
@Test
public void testAccountNo() {
Account account = mock(Account.class);
when(account.creditCard()).thenReturn("101-102-103-104");
assertEquals(account.creditCard(), "101-102-103-104");
when(account.getAcctNo(10110)).thenReturn("10110:101-102-103-104");
String expected = "10110:101-102-103-104";
String result = account.getAcctNo(10110);
assertEquals(expected, result);
}
}

你能建议我们如何为上述场景编写单元测试吗。我需要帮助为getAcctNo方法中的方法creditCard编写JUnit。注意:上面的代码只是一个场景,所以请建议我如何为方法内部的方法调用编写JUnit。

当前您的测试不测试逻辑的任何一行。

when(account.creditCard()).thenReturn("101-102-103-104");
assertEquals(account.creditCard(), "101-102-103-104");

在这里,你基本上只是在测试你的模拟作品
这部分测试也是如此。

when(account.getAcctNo(10110)).thenReturn("10110:101-102-103-104");
String expected = "10110:101-102-103-104";
String result = account.getAcctNo(10110);
assertEquals(expected, result);

测试时,您应该问问自己代码的可见行为是什么?这就是你想要测试的东西。在你的情况下,我想这将是字符串串联在这里:

return accno + ":" + cardno;

这是不应该被嘲笑的部分,因为这是你想要测试的东西。


我看到的另一个问题是类设计本身。accno(我想是accountNumber?(和cardno(cardNumber?(是Account的属性,应该存储在成员变量中。如果您将Account更改为这种设计测试,您的逻辑将变得相当简单:

public class Account {
private String accno;
private String cardno;
public Account(String accno, String cardno) {
this.accno = accno;
this.cardno = cardno;
}
public String getAcctNo() {
return accno + ":" + cardno;
}

// getter and setter for accno and cardno
}

现在,您可以简单地通过构造函数传递关于Account的信息,并测试::getAcctNo()的逻辑

@Test
public void testAccountNo() {

Account account = new Account("10110", "101-102-103-104");
String acctNo = account.getAcctNo();

assertEquals("10110:101-102-103-104", acctNo);
}

最新更新