【问题标题】:Testing for class field with is share among methods使用方法之间共享的类字段测试
【发布时间】:2021-06-05 17:14:20
【问题描述】:

我有一个如下的 Java 类

public class MyClass {
    private final ShowFactory showFactory;
    private SomeShow someShow;

    public MyClass(ShowFactory showFactory) {
        this.showFactory = showFactory;
        startShow();
    }

    public void startShow() {
        someShow = showFactory.createShow();
        someShow.start();
    }

    public void showSomething() {
        MagicBox magicBox = new MagicBox();
        someShow.showSomething(magicBox);
    }

    public void stopShow() {
        someShow.stop();
    }
}

并尝试测试showSomething 方法。完整的测试文件如下

public class MyClassTest {
    private ShowFactory showFactory;
    private SomeShow someShow;

    @Before
    public void setUp() {
        showFactory = mock(ShowFactory.class);
        someShow = mock(SomeShow.class);

        when(showFactory.createShow()).thenReturn(someShow);
    }

    @Test
    public void shouldStartShow() {
        new MyClass(showFactory);

        verify(someShow).start();
    }

    @Test
    public void shouldShowSomething() throws Exception {
        MagicBox magicBox = mock(MagicBox.class);
        PowerMockito.whenNew(MagicBox.class).withAnyArguments().thenReturn(magicBox);
        doNothing().when(someShow).showSomething(magicBox);
        InOrder inOrder = inOrder(someShow);

        MyClass myClass = new MyClass(showFactory);
        myClass.showSomething();

        inOrder.verify(someShow).start();
        inOrder.verify(someShow).showSomething(magicBox);
    }

    @Test
    public void shouldStopShow() {
        MyClass myClass = new MyClass(showFactory);
        myClass.stopShow();

        verify(someShow).start();
        verify(someShow).stop();
    }
}

但是测试 shouldShowSomething 失败并出现错误 Wanted but not invoked。我在这里缺少什么吗?有什么建议吗?

【问题讨论】:

  • 我认为您需要更多步骤才能使用PowerMockito.whenNew 来模拟构造函数调用github.com/powermock/powermock/wiki/… 所以它需要使用PowerMockRunner 运行并使用带有正确类的@PrepareForTest。将方法的内部模拟到构造函数调用是非常深刻的。您是否可以交替使用匹配器来断言magicBox 处于理想状态?喜欢inOrder.verify(someShow).showSomething(argThat(argument -> matchingLogicGoesHere));

标签: java mocking mockito powermockito


【解决方案1】:

这很简单。通读https://github.com/powermock/powermock/wiki/MockConstructor#quick-summary(感谢@roby)后发现我错过了该课程的@PrepareForTest 注释。

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyClass.class)
public class MyClassTest {
 ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    相关资源
    最近更新 更多