2017-11-20 6 views
0

Ich versuche einen Integrationstest zu generieren, ohne @DataJpaTest zu verwenden, um die Konzepte besser zu verstehen. Mir ist aufgefallen, dass ich mit Reflection nicht in der Lage bin, das Dao innerhalb meiner zu testenden Dienstschicht zu bekommen oder einzustellen. Wenn es darum geht, auf das Dao zuzugreifen, das mit der Reflection-API erhalten wurde, gibt es eine NullPointerException zurück. Ich habe Java Reflection API und ReflectionTestUtils von Spring Framework getestet. Hier ist der Code-SnippetReflection funktioniert nicht für Spring autowired Parameter

UserService userService; 

@Before 
public void setUp(){ 
    userService = new UserServiceImpl(); 
    UserDao userDao = (UserDao) ReflectionTestUtils.getField(userService, "userDao"); 
    userDao.deleteAll(); //HERE RETURNS A NULLPOINTER 
    ... 
} 

dass Betrachten in UserServiceImpl.java ich UserDao (Interface injizieren, die JpaRepository mit @Autowired Annotation von Spring-Framework erweitert.

Wie kann ich das Dao Zugriff (durch Spring-Framework implementiert ?!) von meinem Service dank

+0

können Sie den vollen Stack-Trace setzen. ist userDao null oder es wirft NullPointer in einem anderen internen Anruf? – pvpkiran

+0

UserDao-Attribut in RestController ist Null, wenn ich versuche, es mit Reflection zu bekommen, bekomme ich ein Null-Objekt. Ich weiß nicht, wie ich von meinen Integrationstests auf eine @Autowired UserDao-Schnittstelle zugreifen kann. –

+0

Sie erstellen manuell das 'UserServiceImpl'. Sie sollten es autowire und lassen Frühling das Objekt erstellen. Dann wird es alle Abhängigkeiten auffüllen. –

Antwort

1

Ein handlicher Trick ist, Ihr Test Spring-Konfiguration korrekt arbeitet, um sicherzustellen, indem Sie Ihre autowired Abhängigkeiten überprüft wird autowired zum Beispiel tatsächlich bekommen.

@Autowired 
UserDao userDao; 

@Autowired 
UserServiceImpl userService; 

@Test 
public void verifySpringContext() { 
    assertNotNull(userDao); 
    assertNotNull(userService.getUserDao()); 
} 

Ich vermute, dass es in Ihrem Test ein Problem mit der Spring-Konfiguration gibt, das verhindert, dass userDao automatisch gestartet wird.

+0

InFact habe ich vergessen, @RunWith (SpringRunner.class) einzufügen, und ich habe auch den Konstruktor von UserServiceImpl verwendet, anstatt Spring injektieren zu lassen. Es ist die richtige Antwort, weil es mich zur Lösung gebracht hat! Vielen Dank! –