2017-02-15 4 views
3

У меня есть проект со многими тестовыми файлами. В одном из классов тестов мне нужно высмеять финальный класс. Как я выяснил, что это может быть сделано с MockMaker (link), однако это нарушает все мои другие тестовые классы showin как причина:Mock maker для одного класса тестов

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> 

оскорбляющих окончательный класс:

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

Смежные вопросы