2017-05-18 3 views
0

Sagen wir, ich habe folgende Klassen:EasyMock Aufruf autowired Objektmethode

public class A { 
@Autowired B b; 
public void doSomething(){ 
    b.doSomeThingElse(); 
} 


@Component 
@Autowired C c; 
public class B { 
public void doSomethingElse(){ 
    c.doIt(); 
} 

Wie kann ich testen, wenn Sie wissen, ich will c.doIt() verspotten wollen aber b.doSomethingElse(); mit EasyMock anrufen?

Vielen Dank im Voraus

Antwort

1

@Autowired schön, aber neigen dazu, uns darüber, wie zu testen zu vergessen. Fügen Sie einfach einen Setter für b und c hinzu.

C c = mock(C.class); 
c.doIt(); 

replay(c); 

B b = new B(); 
b.setC(c); 
A a = new A(); 
a.setB(b); 

a.doSomething(); 

verify(c); 

Oder verwenden Sie Konstruktor Injektion.

C c = mock(C.class); 
c.doIt(); 

replay(c); 

B b = new B(c); 
A a = new A(b); 

a.doSomething(); 

verify(c); 

In diesem Fall werden die Klassen:

public class A { 
    private B b; 
    public A(B b) { // Spring will autowired by magic when calling the constructor 
     this.b = b; 
    } 
    public void doSomething() { 
     b.doSomeThingElse(); 
    } 
} 

@Component 
public class B { 
    private C c; 
    public B(C c) { 
     this.c = c; 
    } 
    public void doSomethingElse(){ 
     c.doIt(); 
    } 
} 
+0

Dank. aber ich habe verwendet: ReflectionTestUtils.setField, Aber du bist Antwort würde auch funktionieren – user1345883

+0

Es funktioniert auch. Ich hätte antworten können, aber ich mag es nicht wirklich. Bricht Kapselung ab, wenn es nicht notwendig ist – Henri