单测试类模拟器
问题描述:
我有一个包含很多测试文件的项目。在我需要嘲笑最后一堂课的其中一个测试课上。因为我发现了它可以与MockMaker(link)来完成,然而,这打破了所有我的其他测试类舒的原因:单测试类模拟器
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
没有MockMaker其他所有测试都很好。
如何指定仅在单个测试类上使用MockMaker?
答
尝试使用PowerMockito ..它总决赛和静态交易得好:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
惩戒final类:
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({MyFinalClass.class})
public class MyTest {
@Test
public void myFinalClassTest() {
MyFinalClass finalMock= PowerMockito.mock(MyFinalClass .class);
Mockito.when(finalMock.toString()(testInput)).thenReturn("abc");
// Assertions
}
}
您可以使用此功能只在需要的地方。在所有其他您可以保留原始的Mockito用法。
答
你不能嘲笑基于此链接最后一类:https://github.com/mockito/mockito/wiki/FAQ#what-are-the-limitations-of-mockito
看到这些链接:
How to mock a final class with mockito
How to mock a final class with mockito
尝试使用电源的Mockito如下:
public final class Plane {
public static final int ENGINE_ID_RIGHT = 2;
public static final int ENGINE_ID_LEFT = 1;
public boolean verifyAllSystems() {
throw new UnsupportedOperationException("Fail if not mocked!");
}
public void startEngine(int engineId) {
throw new UnsupportedOperationException(
"Fail if not mocked! [engineId=" + engineId + "]");
}
}
public class Pilot {
private Plane plane;
public Pilot(Plane plane) {
this.plane = plane;
}
public boolean readyForFlight() {
plane.startEngine(Plane.ENGINE_ID_LEFT);
plane.startEngine(Plane.ENGINE_ID_RIGHT);
return plane.verifyAllSystems();
}
}
和测试最后一类:
@PrepareForTest(Plane.class)
public class PilotTest extends PowerMockTestCase {
@Test
public void testReadyForFlight() {
Plane planeMock = PowerMockito.mock(Plane.class);
Pilot pilot = new Pilot(planeMock);
Mockito.when(planeMock.verifyAllSystems()).thenReturn(true);
// testing method
boolean actualStatus = pilot.readyForFlight();
Assert.assertEquals(actualStatus, true);
Mockito.verify(planeMock).startEngine(Plane.ENGINE_ID_LEFT);
Mockito.verify(planeMock).startEngine(Plane.ENGINE_ID_RIGHT);
}
}
我不允许修改我的项目的POM,我也无法从“finall”改变类 –