【问题标题】:Mock overridden method using mockito powermokito使用 mockito powermokito 模拟覆盖方法
【发布时间】:2017-02-08 15:18:17
【问题描述】:

我想通过模拟 B1 类的重写方法 a1Method2 来测试我的 Service 类方法 testB1Method2。我不想更改课堂 A1B1 中的任何内容。我正在使用 mockito 1.9.0 和 powermockito 1.4.12。我正在尝试以下代码:

UnitTestService 类:

import static org.mockito.Mockito.*;

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.testng.Assert;
import org.testng.annotations.Test;

public class UnitTestService {

    @Mock
    B1 b1;
    @InjectMocks
    Service service = new Service();

    @Test
    public void testB1Method2() throws Exception {
        MockitoAnnotations.initMocks(this);
        when(b1.a1Method2()).thenReturn("mockvalue");
        PowerMockito.whenNew(B1.class).withArguments(Mockito.any()).thenReturn(b1);
        String output = service.serviceMethod();
        System.out.println("=====" + output);
        Assert.assertTrue("mockvalue".equalsIgnoreCase(output), "testA1Method2 failed!");
    }

}

服务类:

public class Service {

    public String serviceMethod() {
        B1 b1 = new B1("some data");
        return b1.a1Method2();
    }

}

A1 类:

public abstract class A1 {

    public A1(String data) {
        //doing many thing with data
    }

    public String a1Method1() {
        return "from a1Method1";
    }

    public String a1Method2() {
        return "from a1Method2";
    }

}

B1类:

public class B1 extends A1 {

    public B1(String data) {
        super(data);
    }

    @Override
    public String a1Method1() {
        return "a1Method1 from B1 class";
    }

}

我正在使用 Eclipse 中的 testNG 运行课程 UnitTestService。在这里,B1 类中的实际方法a1Method2 被调用,因为它在控制台中打印“=====from a1Method2”。即:这里似乎 mockito 无法模拟此方法。

我应该在 UnitTestService 类中对模拟 B1 类 a1Method2 进行哪些代码更改?

【问题讨论】:

标签: java unit-testing mockito powermock powermockito


【解决方案1】:

您在那里创建了难以测试的代码,绝对没有充分的理由。 让您头疼的是在您的服务类中对 new B1 的小小的调用。

如果您要对该对象使用依赖注入;那么您绝对不需要处理 powermock 和模拟继承方法。因为那时你可以简单地创建一个“模拟”B1;将其传递给您的服务;然后您就可以完全控制测试期间发生的事情。

因此,这里可行的替代方法可能是通过简单地改进生产代码以使其更易于测试来避免复杂的测试设置。

观看videos 以更好地理解我在说什么!

【讨论】:

  • 我不应该在服务方法中创建任何新对象?
  • 我是说:当你使用 new 时,你失去了(很容易!)控制你的对象的能力。因此,避免调用 new 可以使您的代码更好。如前所述:A)阅读依赖注入和B)观看这些视频;至少是第一个......
猜你喜欢
  • 1970-01-01
  • 2019-04-02
  • 2015-12-13
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2020-12-08
相关资源
最近更新 更多