gpt4 book ai didi

java - 忽略 Mockito 中测试方法内部的无效方法

转载 作者:行者123 更新时间:2023-11-29 04:14:04 25 4
gpt4 key购买 nike

在 Account 类中,我有一个方法 public Account reserveA() 我想测试,在 reserveA 中称为方法 public Bank DAO.createB( )。有没有办法在测试方法中调用 reserveA() 但忽略调用 DAO.createB()?这些方法都无效。我试过:

doNothing().when(Account).reserveA(param1, param2);

但这不是正确的方法。

最佳答案

doNothing() 只为 void 方法保留。如果您的方法返回了一些东西,那么您也需要这样做(或抛出异常)。根据您的 Account.reserveString() 的复杂性,如果在其他地方使用结果,您可能需要模拟的不仅仅是这个方法调用。

尝试在非 void 方法上使用 doNothing() 会导致错误:

org.mockito.exceptions.base.MockitoException: 
Only void methods can doNothing()!
Example of correct use of doNothing():
doNothing().
doThrow(new RuntimeException())
.when(mock).someVoidMethod();
Above means:
someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called

考虑这样的类:

@Component
public class BankDao {
public BankDao() {}

public void createVoid() {
System.out.println("sth - 1");
}

public String createString(){
return "sth - 2";
}
}

@Service
public class Account {
@Autowired
private final BankDao DAO;

public Account(BankDao dao) {
this.DAO = dao;
}
public void reserveVoid() {
System.out.println("before");
DAO.createVoid();
System.out.println("after");
}
public void reserveString() {
System.out.println(DAO.createString());
}
}

为其创建测试类:

@RunWith(MockitoJUnitRunner.class)
public class AccountTest {
@Mock
private BankDao bankDao;

@InjectMocks
private Account account;

@Test
public void reserveVoid_mockBankDaoAndDontUseRealMethod() {
doNothing().when(bankDao).createVoid();
account.reserveVoid();
}

@Test
public void reserveString_mockBankDaoAndDontUseRealMethod() {
when(bankDao.createString()).thenReturn("nothing");
account.reserveString();
}
}

运行这样的测试会产生:

nothing
before
after

如果将@Mock 更改为@Spy 并删除带有doNothing() 和when() 的行,那么您将调用原始方法。结果将是:

sth - 2
before
sth - 1
after

关于java - 忽略 Mockito 中测试方法内部的无效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53432677/

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