为另一个方法调用的方法编写junit代码时,避免重复代码
我是Junit的新手。在测试类中,我有两种方法。方法A将调用方法B。在方法B中,我需要在编写测试用例时介绍一些条件案例 所以,在这种情况下,如果我为B编写测试,那么A,测试代码将被复制。你对这个案子有什么想法吗 代码如下所示:为另一个方法调用的方法编写junit代码时,避免重复代码,junit,Junit,我是Junit的新手。在测试类中,我有两种方法。方法A将调用方法B。在方法B中,我需要在编写测试用例时介绍一些条件案例 所以,在这种情况下,如果我为B编写测试,那么A,测试代码将被复制。你对这个案子有什么想法吗 代码如下所示: class Example{ public void A(){ assert B(); varA ++; } public boolean B(){ if (case1){ var1B ++; if (case 1.1){ var2B++;
class Example{
public void A(){
assert B();
varA ++;
}
public boolean B(){
if (case1){
var1B ++;
if (case 1.1){
var2B++;
return false;
}
}
var3B --;
return true;
}
}
谢谢。使用(或其他模拟框架),在测试A时模拟方法B,并使其返回您想要的:
Example example = spy(new Example());
when(example.B()).thenReturn(true);
// now call A() and test that it does what it should to when B() returns true.
我的解决方案是完全测试
B
,然后在测试A
时只测试B
的两种情况:当B
返回true
时和当它返回false
时。这两种情况可能会重复,但如果您设置的实用程序方法将导致B
返回所需值,则应限制重复代码的数量
您可以使用如下方法:
void configureB(boolean case1, boolean case2){...}
然后在全面测试
B
时使用此方法,并使用它来测试A
的两个条件。您不觉得模仿被测试的类有“测试气味”,应该避免吗?我对你的想法很感兴趣,莫基托是这么说的。我个人不明白为什么从同一个类中的另一个调用方法是糟糕的设计。这是我看到的测试方法a而不实际运行调用的方法B的唯一方法。当然,你可以将对象置于一种状态,使B返回true或false,但有时会更复杂,我更喜欢简单的测试而不是复杂的测试。对于简单的设计,只要用户记住上面的注释,就可以+1,但我没有工作。如果in B调用另一个对象,它将抛出异常(如null指针)。它不会独立运行,对吗?不,不会,除非你使用旧版本的Mockito。对于旧版本,必须使用doReturn(true).when(例如).B()
,IIRC。阅读Mockito版本的文档。