2016-06-03 23 views
0

Während mit EasyMock meines Spring classes testen, ich auf dieses unten Szenario kam:

My Spring-Konfiguration von Spring das ursprünglichen DAO-Objekt konfigurierte nimmt component-scan anstatt meine mock DAO Objekt.EasyMock - Frühling das ursprüngliche Objekt nimmt nicht das nachgeahmten Objekt

finden Sie meine Mock, AppContext und Testklasse unter:

ApplicationContxt-Test.xml

<context:annotation-config /> 
<context:component-scan base-package="com.test.testclasses"/> 
<import resource="mockServices.xml" /> 

MockServices.xml

<bean class="org.easymock.EasyMock" factory-method="createMock" 
    id="codeDAO" primary="true" > 
    <constructor-arg value="com.test.testclasses.dao.MaintainCodeDAO" /> 
</bean> 

JUnit-Klasse:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:ApplicationContxt-Test.xml") 
public class MaintainCodeServiceImplTest { 
    @Autowired 
    private MaintainCodeDAO codeDAO; 

    @Autowired 
    private MaintainCodeService maintainCodeService; 

    @Before 
    public void setUp() { 
     EasyMock.reset(codeDAO); 
    } 
    @After 
    public void tearDown() { 
     EasyMock.reset(codeDAO); 
    } 

    @Test 
    public void shouldAutowireDependencies() { 
     assertNotNull(codeDAO); 
     assertNotNull(maintainCodeService); 
    } 
    @Test 
    public void getProcedureByCode_success() throws Exception { 

     MaintainCodeVO maintainCodeVO = new MaintainCodeVO(); 
     EasyMock.expect(codeDAO.searchProcedureCode(isA(String.class))).andReturn(maintainCodeVO); 
     EasyMock.replay(codeDAO); 

     MaintainCodeBO maintainCodeResult = maintainCodeService.getProcedureByCode("test"); 
     EasyMock.verify(codeDAO); 
     codeDAO.searchProcedureCode("test"); 
     assertNotNull(maintainCodeResult); 
     EasyMock.reset(codeDAO); 

    } 
} 

Er Re spot ich codeDAO und während des Testens der Serviceklasse, anstelle der Mock codeDAO, wird das ursprüngliche DAO-Objekt autowired und EasyMock.verify() wirft Ausnahme. Ich weiß nicht, was das Problem ist. Gibt es ein Problem mit der obigen Konfiguration?

Antwort

2

fand ich die Lösung. Der Trick war so einfach .. ich einen Tag getötet, die Lösung zu finden .. hier also ist die Lösung:

einfach die mockServices.xml bewegen (Frühjahr xml mit nur Mock-Konfigurationen) über Kontext: component-scan ...

<import resource="mockServices.xml" /> 
    <context:annotation-config /> 
    <context:component-scan base-package="com.wellpoint.icnotes"/> 

Arbeitete wie ein Charme.

0

Wenn ich mich richtig erinnere, wegen createMock ist eine generische Methode, der Frühling funktioniert nicht richtig beim Ableiten des Bohnentyps, es leitet es als Object, so kann es nicht verkabeln. Ich empfehle, Spring nicht in Einzeltests zu verwenden, sondern einfache Klassen zu verwenden.

BTW, EasyMock seine eigene DI hat, es einfach zu verwenden: http://easymock.org/user-guide.html#mocking-annotations

Es ist möglich, Mocks in einen Kontext zu setzen, zum Beispiel wie hier beschrieben: Autowiring of beans generated by EasyMock factory-method? aber für mich ist es nicht der beste ansatz, sieht tollpatschig aus.

+0

Ja können wir das tun .. Wie Sie sagten, es sieht zu ungeschickt aus. Ich muss Komponententests für mehr als 100 Serviceklassen schreiben und das scheint keine gute Idee zu sein. Ich habe das schon vorher gemacht und weiß nicht, warum es jetzt nicht funktioniert. – Arun

+0

@ArunRaj Ich bevorzuge Injektionen von EasyMock/Mockito DI. Kein Frühling - arbeitet schneller, sieht besser aus, weniger Abhängigkeiten. – kan