如何在void方法上执行Nothing()?

Jim*_*eón 4 testing android unit-testing mockito

我有一个方法可以在其中调用void函数,当我使用时doNothing(),它会说void方法是不允许的.我怎么能doNothing()在那条特定的路线上?

我正在使用这条线,

when(spyColorSelector.initializeColors(view, "red")).then(doNothing());
Run Code Online (Sandbox Code Playgroud)

Dam*_*ils 10

使用Stubber语法:

doNothing().when(spyColorSelector).initializeColors(view, "red");
Run Code Online (Sandbox Code Playgroud)

而且spyColorSelector必须是模拟.


编辑1:使用间谍的代码示例.

initializeColors使用JUnit 4.12和Mockito 1.10.19进行此测试(没有异常抛出):

public class ColorSelectorTest {

    @Test
    public void testGetColors() {
        // Given
        String color = "red";
        View view = mock(View.class);
        ColorSelector colorSelector = new ColorSelector();
        ColorSelector spyColorSelector = spy(colorSelector);
        doNothing().when(spyColorSelector).initializeColors(view, color);

        // When
        LinkedList<Integer> colors = spyColorSelector.getColors(color, view);

        // Then
        assertNotNull(colors);
    }
}

class ColorSelector {

    public LinkedList<Integer> getColors(String color, View view) {
        this.initializeColors(view, color);
        return new LinkedList<>();
    }

    void initializeColors(View view, String color) {
        throw new UnsupportedOperationException("Should not be called");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:没有间谍的新例子.

如果你真的不想initializeColors在测试中执行,我认为ColorSelector课堂上有一个设计问题.该initializeColors方法应该在另一个类X中,并且在类中存在类X的依赖关系ColorSelector,您可以在测试中存根(然后不需要间谍).基本示例:

public class ColorSelectorTest {

    @Test
    public void testGetColors() {
        // Given
        String color = "red";
        View view = mock(View.class);
        ColorSelector colorSelector = new ColorSelector();
        ColorInitializer colorInitializerMock = mock(ColorInitializer.class);
        doNothing().when(colorInitializerMock).initializeColors(view, color);   // Optional because the default behavior of a mock is to do nothing
        colorSelector.colorInitializer = colorInitializerMock;

        // When
        LinkedList<Integer> colors = colorSelector.getColors(color, view);

        // Then
        assertNotNull(colors);
    }
}

class ColorSelector {

    ColorInitializer colorInitializer;

    public LinkedList<Integer> getColors(String color, View view) {
        colorInitializer.initializeColors(view, color);
        return new LinkedList<>();
    }
}

class ColorInitializer {

    public void initializeColors(View view, String color) {
        // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)