Насмешка над пружинным интерфейсом - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть служба с репозиторием @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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...