2016-07-31 14 views
0

So, hier ist mein Code:initialisieren autowired Objekte in TestNG Unit-Tests

@Service("MyCode") 
public class CodeImpl implements CodeI { 

    @Autowired 
    private CodeMapper codeMapper; 

    @Autowired 
    private CodeAppService codeAppService; 

    @Override 
    public CodePOJO getCode(String myId) { 
     CodeDTO codeDTO = codeAppService.getOne(myId); 
     return codeMapper.mapCode(codeDTO); 
    } 

} 

Und das ist die Einheit Test, die ich geschrieben habe:

public class CodeImplTest { 

    @Tested(fullyInitialized = true) 
    CodeImpl codeImpl; 

    @Injectable 
    CodeAppService mockedCodeAppService; 

    @Injectable 
    CodeMapper mockedCodeMapper; 

    @BeforeMethod 
    public void setup_mocks() { 
     codeImpl = new CodeImpl(); 
    } 

    @Test 
    public void testGetCode() throws Exception { 

     final CodeDTO codeDTO = new codeDTO(); 
     codeDTO.setName("my name") 

     new NonStrictExpectations() {{ 
      mockedCodeAppService.getOne(anyString); 
      result = codeDTO; 
     }}; 

     CodePOJO returnedCodePOJO = codeImpl.getCode("1"); 
     assertThat(returnedCodePOJO, is(instanceOf(CodePOJO.class))); 
     assertThat(returnedCodePOJO.getName(), is("my name")); 
    } 

} 

ich dieses folgende uninitialized Ausnahme bin immer:

java.lang.AssertionError: 
     Expected: is "my name" 
     but: was null 

    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) 
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)  
    at com.dev.impl.CodeImplTest.testGetCode(CodeImplTest.java:74) 

Ich habe versucht, es auf dem Forum zu suchen, aber kann keine Antwort zu arbeiten.

Jede Hilfe wird geschätzt.

Danke.

+0

die API-Dokumentation testen '@ Tested', es hat die Antwort. –

+0

Können Sie bitte genauer sein? Ich habe versucht, so viele Beiträge und Dokumente zu lesen, und trotzdem funktioniert es nicht für mich. Entweder ich fiel in NPE oder über Ausnahme. –

+0

Ausführlichere Informationen finden Sie im zweiten Satz des zweiten Absatzes in der API-Dokumentation für '@ Tested':" Standardmäßig erfolgt die automatische Erstellung unmittelbar vor der Ausführung einer Testmethode, vorausgesetzt, das getestete Feld bleibt zu diesem Zeitpunkt null. . " –

Antwort

1

Sie haben nur das Verhalten für codeAppService.getOne() vorbereitet, aber in Ihrem Code wird das Ergebnis dieses Aufrufs dann an codeMapper.mapCode() übergeben.

Ich würde versuchen:

new NonStrictExpectations() {{ 
    mockedCodeAppService.getOne(anyString); 
    result = codeDTO; 
    mockedCodeMapper.mapCode(codeDTO); 
    result = codeDTO; 
}}; 
+0

Ich brauche nicht die zweite, weil das ist die Verhaltenslogik, die ich in meinem Komponententest testen. –

+0

Die Art und Weise, wie Sie Ihren Test definieren, indem Sie @Tested auf Klasse CodeImpl setzen, was Sie testen, ist die Tatsache, dass beim Aufruf von getCode ("1") ein Aufruf von codeAppService.getOne (myId); und dann ein Aufruf von codeMapper.mapCode (codeDTO); sind fertig. Du brauchst also den zweiten. Wenn Sie CodeMapper testen möchten, müssen Sie einen neuen Test für diese Klasse erstellen. – Alfergon