2017-11-30 3 views
2

Ich versuche, einen Dienst, der verschlüsselte Werte von AWS KMS (Amazon Schlüssel-Management-Service) angesichts der Eimer, Schlüssel und Region.Inject 3rd Party Finale Klasse

Dies ist nicht das Problem, das ich habe, aber wenn ich zum Komponententest gehe, möchte ich nicht wirklich eine Drittparteimethode oder einen Integrationstest prüfen und es einen Einheitstest nennen.

Ich möchte in der Lage sein, diese Klasse zu verspotten, um nur Garbage Text zum Testen zurückzugeben.

Wo ich kämpfe ist mit dem AmazonS3ClientBuilder.

Wie kann ich eine Bohne erstellen, um eine Instanz davon zurückzugeben, ohne etwas wie das zu tun.

@Configuration 
Public class config { 
    @Bean 
    public AmazonS3ClientBuilder amazonS3ClientBuilder{ 
     return AmazonS3ClientBuilder.standard(); 
    } 
} 

Hier ist, wie ich dies derzeit verwende.

Sehe ich das falsch und sollte ein AmazonS3 für den Client anstelle des Builders injizieren?

Vielen Dank im Voraus.

+0

Ich denke, Sie sollten stattdessen den tatsächlichen S3Client injizieren und seine Konstruktion und Konfiguration in Ihrer Konfigurationsklasse belassen. Wenn Ihre Tests dann ausgeführt werden, können Sie einfach ein anderes S3Client Bean konfigurieren, das einen Mock zurückgibt und etwas wie Mockito verwendet. –

+0

Wenn die für die Erstellung des Clients benötigten Eingaben bis zur Laufzeit nicht bekannt sind, würde ich das berücksichtigen, da ich den Client ohne diesen Client nicht erstellen kann. –

+0

Wie würden Sie das im Allgemeinen oder speziell für Ihre Testfälle unterbringen? –

Antwort

0

zu setzen, was wir in einem Beispiel diskutiert hatte, wie wäre es so etwas wie dieses:

Anwendungskonfiguration

@Configuration 
public class Config { 
    @Bean 
    public AmazonS3 getClient(){ 
     //TODO: Pull whatever you need from KMS, create credentials, define region, etc 
     return AmazonS3ClientBuilder.standard().withRegion("my region").build(); 
    } 

} 

Dies ist, was normalerweise in die Applikation eingespritzt wird. Anstatt den Builder zu injizieren, spende ich stattdessen einen vordefinierten S3Client. Dann in meinen Unit-Tests kann ich tun:

Beispiel Typentest

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class SampleTest { 

    @Configuration 
    static class ContextConfiguration { 
     @Bean 
     public AmazonS3 gets3(){ 
      System.out.println("Providing mocked s3..."); 
      //TODO: Provide when/then statements, etc 
      return Mockito.mock(AmazonS3.class); 
     } 
    } 

    @Test 
    public void testSomething(){ 
     //TODO: Test something that utilizes S3Client 
    } 
} 

die stattdessen eine Mocked Version des S3Client bieten soll, wenn der Test durchgeführt wird. Dies ist ein bisschen ein nacktes Beispiel, eine andere Möglichkeit wäre, einen ähnlichen Ansatz zu wählen, aber verwenden Sie @Profile, um ein Testprofil zu aktivieren. Oder Sie könnten sogar die gesamte s3-Interaktion hinter einer anderen Klasse verbergen und sich stattdessen darüber lustig machen, die s3-Implementierung von Klassen zu abstrahieren, die mit Speicher umgehen müssen.