2017-02-15 165 views
3

我有一个包含很多测试文件的项目。在我需要嘲笑最后一堂课的其中一个测试课上。因为我发现了它可以与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?

回答

1

尝试使用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用法。

+0

我不允许修改我的项目的POM,我也无法从“finall”改变类 –

0

你不能嘲笑基于此链接最后一类: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); 
    } 
} 

例如链接:https://dzone.com/articles/mock-final-class