【问题标题】:How to mock an object which is created inside a method which is under test only with mockito not with powermockito?如何模拟在仅使用 mockito 而不是 powermockito 测试的方法中创建的对象?
【发布时间】:2019-12-13 10:31:28
【问题描述】:

我一直在练习 Junit 来编写测试用例,并且遇到了 Mockito,我可以用它来模拟依赖对象。所以我写了一个示例代码来测试它的行为。

我有两个类SampleSecond

第二个类有一个简单的方法,它只返回一个字符串作为参数传递给这个方法

public class Second{
    public String show(String y ){
        return y
    }
}

现在有一个 Sample 类,我在 Sample 类的方法中调用了这个 show 方法并返回字符串。

public class Sample{
    public String sampleMethod(){
        Second s = new Second();
        return s.show("This should not be displayed");
    }
}

现在我正在测试 Sample 类,因此我创建了一个名为 SampleTest

的文件
public class SampleTest{
    @Mock
    Second s;

    @InjectMocks
    Sample s = new Sample();

    @Before
    public void setUp(){
        MockitoAnnotations.initMocks(this);
        when(s.show(any(String.class))).thenReturn("This should be displayed");
    }

    @Test
    public void sampleMethodTest(){
        assertEquals("This should be displayed", s.sampleMethod());
    }
}

现在创建了 Second classes 对象并在 Sample 方法中调用了它的方法,我已经模拟了 Second class 并将模拟注入到 Sample 中。

然后在 Before 方法中,我编写了 when 和 thenReturn 语句:

当在第二个对象中调用 show 方法时,我返回了我想要的输出,即“应该显示”

但是输出不是我所期望的,而不是调用 when 和 thenreturn 语句,而是调用 Second 对象中真正的 show 方法。

我无法模拟创建该方法的对象。

我该怎么做?

我只需要使用 mockito 而不是 powermockito

【问题讨论】:

  • 您是否尝试在类级别定义第二个变量?

标签: java unit-testing mocking mockito


【解决方案1】:

SampleSecond 紧密耦合,方法是在被测方法中创建它。

鉴于当前规定的限制,

我只需要使用 mockito 而不是 powermockito

Mockito 将无法模拟在 Sample 中使用的 Second

如果Sample 可以通过构造函数注入进行重构以遵循更可靠的设计,例如显式依赖原则。

public class Sample {

    private final Second second;

    public Sample(Second second) {
        this.second = second;
    }

    public String sampleMethod(){
        return s.show("This should not be displayed");
    }
}

那么依赖就可以被模拟并注入到被测主题类中

public class SampleTest {
    @Mock
    Second second;

    @InjectMocks
    Sample sample; //second will be injected here

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);            
    }

    @Test
    public void sampleMethodTest() {
        //Arrange
        String expected = "This should be displayed";
        when(second.show(any(String.class))).thenReturn(expected);

        //Act
        String actual = sample.sampleMethod();

        //Assert
        assertEquals(expected, actual);
    }
}

注意对测试的更改,以便它在执行时按预期运行。

如果你不能重构Sample,powerMockito 可以mock the class initialization

虽然 powerMockito 允许这样的事情,但它会导致糟糕的设计选择,并且代码闻起来像紧耦合,这使得代码难以单独维护和测试。

【讨论】:

  • 我明白了。如果我不想重构 Sample 类,我还能使用 powerMockito 模拟 Second 对象吗?
  • 好的,谢谢。你能不能给我一个用 power mock 模拟我的例子的基本例子?
  • @Harish 我包含了一个链接。现在因为我反对使用 PowerMockito,所以我故意没有展示它,因为如果可以做替代品,我不想鼓励它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多