为另一个方法调用的方法编写junit代码时,避免重复代码

为另一个方法调用的方法编写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++;

我是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++;
    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版本的文档。