У меня есть служба с репозиторием @Autowired
, которую я хотел бы посмеяться над PowerMock. Конечно, просто создать макет довольно легко, но проблема заключается в его внедрении.
Мой тестовый набор должен запускать 2 разных сервера, поэтому я запускаю такой код:
new SpringApplicationBuilder(Server.class)
.profiles("test")
.properties("server.port=" + port)
.run();
И поэтому у меня нет ссылки на репозиторий, который я хочу заменить на фиктивный, и поэтому решение Whitebox
, вероятно, не работает.
Я пытался сделать что-то вроде этого
Queue mockQueue = mock(Queue.class);
whenNew(Queue.class).withAnyArguments().thenReturn(mockQueue);
но поскольку Queue
- это интерфейс, он на самом деле не работает. И у меня нет никакой реализации, чтобы поддразнивать.
Так что я застрял здесь, и мне интересно, можно ли это сделать и как?
Для справки это хранилище
@Repository
public interface Queue extends JpaRepository<QueueItem, Long> {
...
}
ради этого я пытался шпионить за содержащим класс следующим образом:
QueueService queueService = spy(new QueueService());
whenNew(QueueService.class).withAnyArguments().thenReturn(queueService);
и затем установите внутреннее состояние:
Whitebox.setInternalState(queueService, "queue", mockQueue);
И это работает, если я создаю новый QueueService
из теста, но если я запускаю обычно, тогда QueueService
не будет шпионским объектом
О, мой тестовый класс в настоящее время аннотирован так:
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@PrepareForTest(QueueService.class)
Все зависимости, которые у меня есть:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-web-autoconfigure</artifactId>
<version>0.0.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectreactor</groupId>
<artifactId>reactor-spring</artifactId>
<version>1.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.27</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.27</version>
<scope>test</scope>
Также довольно интересно то, что класс загружается MockClassLoader