2016-07-16 5 views
0

Umwelt:Wie Mocks in Frühling Dienst injizieren

Spring MVC 4

Junit

Mockito

Code:

Frühlings-Service im Test:

@Service("abhishekService") 
public class AbhishekServiceImpl implements AbhisheskService { 

    @Autowired 
    private DaoOne daoOne; 
    @Autowired 
    private DaoTwo daoTwo; 
    @Autowired 
    private DaoThree daoThree; 
    @Autowired 
    private DaoFour daoThree; 

} 

Junit Test:

public class AbhishekServiceImplTest { 

    @Mock 
    private DaoOne daoOne; 
    @Mock 
    private DaoTwo daoTwo; 
    @Mock 
    private DaoThree daoThree; 
    @Mock 
    private UserDao userDao; 

    private AbhisheskService abhisheskService; 

    @Before 
    public void setUp(){   

     MockitoAnnotations.initMocks(this); 
     abhisheskService = new AbhishekServiceImpl(); 

    } 

}

Ausgabe:

1) Wie man in Codeausschnitt gezeigt, verwendet die Klasse im Test vier Abhängigkeiten.

2) Wie in Code-Schnipsel zwei gezeigt, in JUnit-Testfall-Klasse, alle 4 Abhängigkeiten verspottet verwenden @Mock

3) Meine Frage ist: wie diese vier verspottet Objekte in Testklasse injiziert werden sollte?

4) Meine Klasse im Test nicht Konstruktor/Setter Injektion sondern Feldeinkopplung haben mit @Autowired.

5) Ich möchte nicht @InjectMocks Anmerkung verwenden, wegen seiner gefährlichen Verhaltens as mentioned here

Can jemand bitte hierüber leiten?

+0

Konnte der Service nicht umgestaltet werden, um Konstruktoreinspritzung zu haben? Es ist eine einfache Sache zu tun. – Magnilex

+0

Der Artikel, den Sie selbst verlinkt haben, enthält bereits Hinweise, wie Sie das Problem vermeiden können - was brauchen Sie noch? – kryger

Antwort

1

Sie versuchen, eine Klasse zu testen, die fälschlicherweise entwickelt wurde, um das Verhalten zu testen, d. H. Die Eigenschaften sind nicht zugänglich für Spott. AbhishekServiceImpl muss eine Möglichkeit bieten, die Mocks in die Klasse zu injizieren. Wenn Sie nicht auf die Felder zugreifen können, handelt es sich eindeutig um eine falsch entworfene Klasse. Bedenkt man, dass die AbhishekServiceImpl eine Klasse in einem Legacy-Code ist und Sie versuchen, das Verhalten zu testen, dann können Sie Reflektion verwenden, um die Mock-Objekte, wie unten zu injizieren:

DaoOne mockedDaoOne = mock(DaoOne.class); 
    when(mockedDaoOne.doSomething()).thenReturn("Mocked behaviour"); 

    AbhishekService abhishekService = new AbhishekServiceImpl(); 
    Field privateField = PrivateObject.class.getDeclaredField("daoOne"); 

    privateField.setAccessible(true); 

    privateField.set(abhishekService, mockedDaoOne); 

    assertEquals("Mocked behaviour", abhishekService.doSomething()); 

Es ist sehr selten, dass man das Verhalten einer Klasse testen, die du hast dich nicht selbst geschrieben. Obwohl ich mir einen Anwendungsfall vorstellen kann, in dem Sie eine externe Bibliothek testen müssen, weil der Autor sie nicht getestet hat.

0

Sie können den Junit-Test mit @RunWith (SpringJUnit4ClassRunner.class) markieren und dann mithilfe von @ContextConfiguration einen Kontext definieren, der die DAOs und den Dienst instanziiert und miteinander verbindet.

Verwandte Themen