84

私のSpring-Bootアプリでは、@Configurationファイルを介してRestTemplateを提供しているため、適切なデフォルト(タイムアウトなど)を追加できます。私の統合テストでは、外部サービスに接続したくないので、RestTemplate をモックしたいと思います。どのような応答が期待されるかはわかっています。後者が実際の実装をオーバーライドすることを期待して、統合テストパッケージに別の実装を提供しようとしましたが、ログを確認すると、それは逆です:実際の実装はテストのものをオーバーライドします.

TestConfig のものが使用されていることを確認するにはどうすればよいですか?

これは私の設定ファイルです:

@Configuration
public class RestTemplateProvider {

    private static final int DEFAULT_SERVICE_TIMEOUT = 5_000;

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate(buildClientConfigurationFactory());
    }

    private ClientHttpRequestFactory buildClientConfigurationFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(DEFAULT_SERVICE_TIMEOUT);
        factory.setConnectTimeout(DEFAULT_SERVICE_TIMEOUT);
        return factory;
    }
}

統合テスト:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfiguration.class)
@WebAppConfiguration
@ActiveProfiles("it")
public abstract class IntegrationTest {}

TestConfiguration クラス:

@Configuration
@Import({Application.class, MockRestTemplateConfiguration.class})
public class TestConfiguration {}

そして最後に MockRestTemplateConfiguration

@Configuration
public class MockRestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        return Mockito.mock(RestTemplate.class)
    }
}
4

10 に答える 10

47

@MockBeanSpring Boot 1.4.x 以降、注釈を使用して Spring Bean を偽造するオプションがあります。

コメントに対する反応:

コンテキストをキャッシュに保持するには、 を使用せずに を使用し@DirtiesContextます@ContextConfiguration(name = "contextWithFakeBean")。別のコンテキストが作成されますが、デフォルトのコンテキストはキャッシュに保持されます。Spring は両方 (またはコンテキストの数) をキャッシュに保持します。

私たちのビルドはこの方法であり、ほとんどのテストはデフォルトの汚染されていない構成を使用していますが、Bean を偽造している 4 ~ 5 個のテストがあります。デフォルトのコンテキストはうまく再利用されています

于 2017-01-04T02:44:05.690 に答える
43

1.@Primary注釈を使用できます。

@Configuration
public class MockRestTemplateConfiguration {

    @Bean
    @Primary
    public RestTemplate restTemplate() {
        return Mockito.mock(RestTemplate.class)
    }
}

ところで、 Spring Bean の偽造についてブログ記事を書きました

2.しかし、Spring RestTemplate testing supportを確認することをお勧めします。これは簡単な例です:

  private MockRestServiceServer mockServer;

  @Autowired
  private RestTemplate restTemplate;

  @Autowired
  private UsersClient usersClient;

  @BeforeMethod
  public void init() {
    mockServer = MockRestServiceServer.createServer(restTemplate);
  }

  @Test
  public void testSingleGet() throws Exception {
    // GIVEN
    int testingIdentifier = 0;
    mockServer.expect(requestTo(USERS_URL + "/" + testingIdentifier))
      .andExpect(method(HttpMethod.GET))
      .andRespond(withSuccess(TEST_RECORD0, MediaType.APPLICATION_JSON));


    // WHEN
    User user = usersClient.getUser(testingIdentifier);

    // THEN
    mockServer.verify();
    assertEquals(user.getName(), USER0_NAME);
    assertEquals(user.getEmail(), USER0_EMAIL);
  }

その他の例は、こちらの Github リポジトリにあります。

于 2016-03-02T11:47:58.700 に答える