2017-06-15 2 views
0

Versionen:SpringBootTest mit MockBean nicht zurückkehrt, was ich erwarte

Java: 1.8 
Spring Boot: 1.5.4.RELEASE 

Anwendung Haupt:

@SpringBootApplication 
public class SpringbootMockitoApplication implements CommandLineRunner { 
    @Autowired 
    MyCoolService myCoolService; 

    public static void main(String[] args) { 
     SpringApplication.run(SpringbootMockitoApplication.class, args); 
    } 

    @Override 
    public void run(String... strings) throws Exception { 
     System.out.println(myCoolService.talkToMe()); 
    } 
} 

Mein Service Interface:

public interface MyCoolService { 
    public String talkToMe(); 
} 

Mein Service Implementation:

@Service 
public class MyCoolServiceImpl implements MyCoolService { 

    @Override 
    public String talkToMe() { 
    return "Epic Win"; 
    } 
} 

My Test-Klasse:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class SpringbootMockitoApplicationTests { 

    @MockBean 
    private MyCoolService myCoolService; 

    @Test 
    public void test() { 
     when(myCoolService.talkToMe()).thenReturn("I am greater than epic"); 

    } 

} 

Erwartete Ausgabe: Ich bin größer als episch Tatsächliche Ausgabe: null

ich wollen einfach die Bean-Instanz in Zusammenhang mit einem Mock ersetzen, „ich zurückkehren bin größer als episch ". Habe ich hier etwas falsch konfiguriert?

+0

Ich habe den Test mit den oben genannten Klassen und der gleichen Spring Boot-Version ausgeführt, und es funktioniert problemlos. Haben Sie in Ihrer 'pom.xml 'sowohl' Spring-Boot-Starter-Test'- als auch 'Spring-Boot-Test'-Abhängigkeiten hinzugefügt? –

Antwort

3

Die run Methode einer beliebigen CommandLineRunner s wird aufgerufen als Teil von SpringApplication läuft. Dies geschieht, wenn das Testframework den Anwendungskontext für Ihre Tests bootstrappt. Entscheidend ist, dass Ihre Testmethode keine Erwartungen an Ihr Modell MyCoolService hat. Als Ergebnis gibt der Schein null zurück, wenn talkToMe() aufgerufen wird.

Es könnte etwas verloren gehen, wenn Sie Ihr Problem auf ein einfaches Beispiel reduzieren, aber ich glaube nicht, dass ich hier einen Integrationstest verwenden würde. Stattdessen würde ich Unit CommandLineRunner mit einem Schein-Service testen. Zu diesem Zweck empfehle ich, zur Konstruktorinjektion zu wechseln, damit Sie den Mock direkt in den Konstruktor des Service übergeben können.

+0

Diese Anwendungsstruktur war für einen Batch-Prozess gedacht, der beim Start zum Testen ausgeführt wird, wäre es sinnvoller, den BefehlLineRunner irgendwie zu deaktivieren und die Logik im Runner zu replizieren? –

Verwandte Themen