【发布时间】:2020-12-08 13:11:18
【问题描述】:
假设我有一个类Tournament,其方法为register() 和isAlreadyRegistered()。下面是示例代码。
public class Tournament {
private boolean register(String teamName) {
if(!isAlreadyRegistered(teamName)) {
// register team
return True;
}
return False;
}
private boolean isAlreadyRegistered(String teamName) {
// Check if team is already registered, involves DB calls
}
public static void main(String[] args) throws Exception {
Tournament tournament = new Tournament();
tournament.register("e-LEMON-ators");
}
}
我有一个 Java 测试用例,它调用 Tournament 类的 main 方法,这导致调用
register() 方法和register() 方法调用isAlreadyRegistered()。考虑下面的代码:
@Test
public void testTournament() {
try {
Tournament.main(args);
} catch (Exception e) {
fail();
}
}
我想模拟isAlreadyRegistered(),可能使用Mockito,所以它总是返回True
注意:该示例仅用于演示目的,我不能修改 Tournament 类。只能在测试用例中进行修改。单独测试register() 不是一种选择(必须通过 main 方法进行调用)
编辑:我无法为 Tournament 类创建对象,即我只能通过 main() 方法与该类交互
【问题讨论】:
-
感谢@SusanMustafa,但我无法为
Tournament类创建对象,即我只能通过main()方法与该类交互 -
那么您基本上就拥有了“超级难以测试的代码”。现实世界的解决方案是更改您的生产代码。但请注意:您可以使用 PowerMock(ito),这将允许您“拦截”对
new Tournament()的调用以返回一些模拟对象(并且您仍然可以在需要时调用真实方法的模拟)。但所有这些都是肮脏的黑暗魔法。除非你真的别无选择,否则不要这样做。
标签: java unit-testing junit mocking mockito