У меня есть класс, который тестирует конкретный контроллер, и он отлично работает
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/test-applicationContext-config.xml")
@TestExecutionListeners({
WebContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class })
public class TestAdminController {
//.....
}
Я использовал библиотеку Google Mockito из mockito.org, чтобы издеваться над моими базовыми компонентами.
Теперь мой вопрос заключается в следующем: у меня есть несколько классов, которые также нужно имитировать, но у них есть final
методы, и mockito от Google, похоже, не решает эту проблему. Один из моих коллег предложил использовать Powermock с сайта powermock.org. Но для этого требуется аннотировать класс тестера аннотацией @RunWith(PowerMockRunner.class)
. Если я использую это, мне нужно удалить аннотацию @RunWith(SpringJUnit4ClassRunner.class)
, и это создаст мне проблемы, потому что контекст теста Spring не будет создан. Как я могу избежать этой ситуации?
После предложения я настроил использование PowerMockRule
вместо @RunWith
аннотации.
Зависимости моего проекта Maven следующие:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-mockito-release-full</artifactId>
<version>1.5</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>1.5</version>
<scope>test</scope>
</dependency>
Теперь мой класс выглядит так (еще один тест контроллера)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/test-applicationContext-config.xml")
@TestExecutionListeners({
WebContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class })
@PrepareForTest(ADSynchronizationImpl.class)
public class ThirdPartyLoginControllerTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
@Autowired
private ThirdPartyLoginController thirtPartyLoginController;
@Autowired
private MockFactoryForControllers mockFactory;
@Test
public void testLoginActiveDirectory(){
}
}
Но после запуска моего теста я получаю следующую трассировку исключения
Взгляните на эту статью который объясняет, как использовать PowerMock и
. По сути, вам просто нужно использовать специальное@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:config/test-applicationContext-config.xml") @TestExecutionListeners({ WebContextTestExecutionListener.class, DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class }) public class TestAdminController { //..... }
final
правило: