2016-03-22 31 views
2

Ich bin Google Guice mit dieser Klasse Beispieländern Wert von guice Instanz zur Laufzeit

class A { 
    String a; 
} 

Dann in meiner Klasse injiziert B zu injizieren

class B { 
    @Inject A aInstance; 

    public void checkValue(){ 
      System.out.println(aInstance.a); 
    } 
    } 

Vielleicht aspectj verwenden, aber was würde ich Wie es ist, würde dieser eine Test von mir diese A-Instanz bekommen und würde die "a" -Zeichenfolge als "foo" setzen, bevor der Test ausgeführt wird, der die B-Klasse abdeckt, also wenn die B-Klasse checkValue aufruft, würde dieser "foo "

+0

Wenn Sie die gleiche Instanceof 'A' bekommen, die funktionieren sollte. Ich weiß es nicht so gut, aber ich denke, es hat eine Art von Scoping wie CDI, d. H. Es ist wahrscheinlich in der Lage, dieselbe Instanz einer Klasse in mehrere Injektionsziele zu injizieren. – Thomas

+0

Es klingt wie eine Aufgabe für das Spott Framework. Siehe Mockito: http://mockito.org/ – nukie

Antwort

1

Sie erwähnen das Wort Test in Ihrer Frage - wenn Sie einen jUnit Test schreiben für B können Sie die Injektion in einer @Before-Klausel durchführen, wie gezeigt here.

private Injector injector; 

@Before 
public void init() throws Exception { 
    injector = Guice.createInjector(new AbstractModule() { 

     @Override 
     protected void configure() { 
      bind(A.class).to(MockedInstanceOfAWithValueFoo.class); 
     } 
    }); 
} 

Sie auch

bind(A.class).toInstance(new MockedInstanceOfAWithValueFoo()); 

Wenn wir, dass A einen Konstruktor hat, durch die davon ausgehen, nennen könnten wir Aa definieren können, wie dies die nachgeahmten Beispiel aussehen könnte: Wieder

public class MockedInstanceOfAWithValueFoo extends A{ 

    public MockedInstanceOfAWithValueFoo() { 
     super("foo"); 
    } 

} 

, Sie könnten Ihre gespielte Klasse dazu bringen, den Wert von Aa über einen Konstruktor zu akzeptieren, um die Erstellung von B (und den zugehörigen Wert von Aa) dynamischer zu machen.

+0

Dieser Code wird nicht kompiliert. Zumindest mit einer Scheinklasse, die ich erstellt habe – paul

+0

Welcher Teil kompiliert nicht? Die Klasse 'MockedInstanceOfAWithValueFoo' existiert nicht. Sie müssen das selbst erstellen. Da A keine Schnittstelle ist, stelle ich mir vor, dass die mockige Instanz einfach eine Klasse sein wird, die A erweitert, und die vielleicht das Feld A.a durch einen Setzer oder einen Konstruktor setzt. – Hervian

+0

ja natürlich, ich erstelle meine eigene Scheinklasse. Aber du hast Recht, ich habe vergessen, dass der Schein erweitert A. Dank – paul

1

Mit Mockito:

import static org.junit.Assert.assertNotNull; 
import static org.mockito.Mockito.when; 

import org.junit.Before; 
import org.junit.Test; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 

public class MyTest { 

    @Mock 
    A mockA; 

    @InjectMocks 
    B mockB; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
     mockA.a = "Foo"; 
     //when(mockA.getA()).thenReturn("Foo"); //if you use getter 
    } 

    @Test 
    public void myTest() { 
     assertNotNull(mockA); 
     assertNotNull(mockA.a); 
     assertNotNull(mockB); 
     assertNotNull(mockB.ainstance); 
     mockB.checkValue(); 
    } 

} 
+0

Ich fürchte, es ist kein Komponententest, sondern ein BBD-Test – paul

Verwandte Themen