如何使用Mockito创建新类的实例时模拟异常

Joh*_*iou 6 java junit mocking mockito

在一个方法中,我有一个异常被捕获,我想要模拟.

我知道如何使用mock.doSomething()来模拟一个对象抛出一个异常,但是当一个类创建一个新的自身实例时,我需要抛出一个远程异常.

transient Bicycle bike = null;

public Bicycle getBicycle() {
    if (bike == null) {
        try {
            bike = new Bicycle(this);
        } catch (RemoteException ex) {
            System.out.println("No bikes found");
        }
    }
    return bike;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够模拟try块中的所有内容,但我不明白你是如何模拟新类的创建的,具体如下:

bike = new Bicycle(this);
Run Code Online (Sandbox Code Playgroud)

我尝试过许多不同的Mockito测试,例如:

Bicycle b = mock(Bicycle.class);
Mockito.doThrow(new RemoteException()).when(b = new Bicycle());
Run Code Online (Sandbox Code Playgroud)

虽然我明白这会起作用但不起作用,但我想做类似的事情.

我已经阅读了Mockito文档并且没有找到任何有用的东西:

http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html

Jon*_*eet 7

你通常不会模拟构造函数.你可以使用像PowerMock这样的工具,但我通常建议你不要这样做.

目前,如果要控制Bicycle构造new时会发生什么,那么您的代码实际上是不可测试的.构建一个Bicycle实际上是一个复杂的操作?也许你想要一个BicycleFactory,例如可以作为依赖项传递到你的类中 - 然后你可以模拟BicycleFactory.createBicycle或者你称之为的任何东西.

构造函数就像静态方法 - 当你使用它们时,你就会紧紧地绑定你所调用的特定代码; 没有像PowerMock那样的方法,没有干净的方式来注入其他行为.


Rog*_*rio 4

在这种情况下,您可以使用 Mockito 扩展 PowerMock。它允许模拟构造函数(请参阅https://code.google.com/p/powermock/wiki/MockConstructor)。

在这种情况下,您将编写类似以下测试的内容:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassUnderTest.class, Bicycle.class})
public class ConstructorMockingTest
{
    @Test
    public void getBicycle()
    {
        ClassUnderTest tested = new ClassUnderTest();
        whenNew(Bicycle.class).withArguments(tested).thenThrow(new RemoteException());

        Bicycle bicycle = tested.getBicycle();

        assertNull(bicycle);
    }
}
Run Code Online (Sandbox Code Playgroud)

更多示例可以在以下位置找到:https://code.google.com/p/powermock/source/browse/trunk/modules/module-test/mockito/junit4/src/test/java/samples/powermockito/junit4/whennew /WhenNewTest.java