gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:09:06 24 4
gpt4 key购买 nike

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

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() 方法。我遵循了这里的建议:Mockito How to mock only the call of a method of the superclass我现在有。

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() 方法,我无法获得比 package-private 更严格的可见性。

最佳答案

当您监视 一个对象时,您完全替换了您为其定义模拟行为的方法的实现。因此,正如您在问题中指出的那样,这是行不通的。

解决这个问题的一个技巧是提取一个 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
}
}

关于java - Mockito - 在测试相同方法的派生类实现时模拟基实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23196456/

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