java - Mockito模拟基实现,同时测试相同方法的派生类实现

  显示原文与译文双语对照的内容
0 0

我正在使用Mockito进行一些单元测试。 我有以下类:

public class Base {
 public void say() {
 System.out.println("Base");//some work in the base class
 }
}
public class Derived extends Base {
 @Override
 public void say() {
 super.say();//do the base class work
 System.out.println("Derived");//some additional work in the derived class
 }
}

现在我想测试类方法的派生 say(),而模拟基 say() 方法。 我遵循了这里的建议: 如何模仿只有一个方法的方法的调用,我现在已经经有了。

public class DerivedTest {
 @Test
 public void testSay() {
 Derived obj = Mockito.spy(new Derived());
 Mockito.doNothing().when((Base)obj).say();
 obj.say();
//assert only"Derived" was output
 }
}

但是这并不适用,因为它同时模拟了基类和派生类实现。 我只想测试派生类中的额外逻辑。

我该怎么做。

更新:我的解决方案

因为我不能改变基类,所以我修改了派生类,以便在一个单独的方法中提取所有的逻辑。

public class Derived extends Base {
 @Override
 public void say() {
 super.say();//do the base class work
 doAdditionalWork();//some additional work in the derived class
 }
 void doAdditionalWork() {
 System.out.println("Derived");
 }
}
public class DerivedTest {
 @Test
 public void testDoAdditionalWork() {
 Derived obj = new Derived();
 obj.doAdditionalWork();
//assert only"Derived" was output
 }
}

这意味着我仍然没有测试派生的say() 方法,但是考虑到逻辑现在很简单,我希望可以以取消。 另一个缺点是,对于 doAdditionalWork() 方法,我不能让可见性比包更严格。

时间:原作者:1个回答

0 0

当你对对象进行 spy 时,你完全替代了定义了模拟行为的方法的实现。 所以,就像你在这个问题中所指出的,这。

around的一个技巧是提取 additionalBehavior() 方法,并且只测试它,无需监视或者模仿:

public class Base {
 public void say() {
 System.out.println("Base");//some work in the base class
 additionalBehavior();
 }
 protected void additionalBehavior() {
//No implementation. Alternatively - make it abstract
 }
}
public class Derived extends Base {
 @Override
 protected void additionalBehavior() {
 System.out.println("Derived");//some additional work in the derived class
 }
}
public class DerivedTest {
 @Test
 public void testAdditionalBehavior() {
 Derived obj = new Derived();
 obj.additioanlBehavior();
//assert that"Derived" was the output
 }
}
原作者:
...