2012-05-09 25 views
18

Jeśli mam klasę z metodą @PostConstruct, jak mogę przetestować jej konstruktora, a tym samym jego metodę @PostConstruct przy użyciu JUnit i Spring? Nie mogę po prostu użyć nowego ClassName (param, param), ponieważ wtedy nie używa Springa - metoda @PostConstruct nie jest uruchamiana.Jak przetestować konstruktor klasy, która ma metodę @PostConstruct przy użyciu Spring?

Czy brakuje tu czegoś oczywistego?

public class Connection { 

private String x1; 
private String x2; 

public Connection(String x1, String x2) { 
this.x1 = x1; 
this.x2 = x2; 
} 

@PostConstruct 
public void init() { 
x1 = "arf arf arf" 
} 

} 


@Test 
public void test() { 
Connection c = new Connection("dog", "ruff"); 
assertEquals("arf arf arf", c.getX1(); 
} 

Mam coś podobnego (choć nieco bardziej złożonego) niż to, a metoda @PostConstruct nie zostanie trafiona.

Odpowiedz

11

Spójrz na Spring JUnit Runner.

Musisz wstrzyknąć swoją klasę w swoją klasę testową, aby wiosna zbudowała twoją klasę i będzie również wywoływać metodę konstruowania postów. Zobacz przykład kliniki dla zwierząt domowych.

np

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:your-test-context-xml.xml") 
public class SpringJunitTests { 

    @Autowired 
    private Connection c; 

    @Test 
    public void tests() { 
     assertEquals("arf arf arf", c.getX1(); 
    } 

    // ... 
+0

Rozumiem to, o czym mówiłem. Ale jak przetestować wiele permutacji tego konstruktora w jednej klasie testowej? Co ja nie mówię o moim pytaniu? – AHungerArtist

+0

Chcę pięć przypadków testowych dla konstruktora tej klasy. Czy naprawdę nie ma lepszego sposobu niż kontekst aplikacji z pięcioma takimi fasolami i załadowanie go? – AHungerArtist

+0

W czasie rzeczywistym, jeśli istnieje 5 możliwych sposobów wstrzyknięcia twojej klasy, obawiam się, że w tym przypadku musisz utworzyć 5 definicji fasoli. –

0

@PostConstruct musi zmieniać stan obiektu. Tak więc, w przypadku JUnit, po otrzymaniu fasoli sprawdź stan obiektu. Jeśli jest taki sam jak stan ustawiony przez @PostConstruct, oznacza to, że test się powiódł.

+0

Problem polega nie na tym, jak przetestować, czy to się zmieniło, ale to, że @PostConstruct się nie uruchamia. Będę edytować mój post, aby było to bardziej jasne. – AHungerArtist

0

Domyślnie Wiosna nie będzie świadomy @PostConstruct i @PreDestroy adnotacji. Aby go włączyć, musisz albo zarejestrować "CommonAnnotationBeanPostProcessor" lub określić "w pliku konfiguracyjnym komponentu bean.

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

lub

<context:annotation-config />

17

Jeśli tylko pojemnik udało część Connection jest metoda @PostContruct, po prostu zadzwoń go ręcznie w metodzie testowej:

@Test 
public void test() { 
    Connection c = new Connection("dog", "ruff"); 
    c.init(); 
    assertEquals("arf arf arf", c.getX1()); 
} 

Jeśli istnieje jest czymś więcej, jak zależnościami i tak dalej możesz albo wstrzykiwać je ręcznie lub - jak stwierdził Sridhar - użyj wiosennego szkieletu testowego.

+0

Właśnie to zrobiłem. – AHungerArtist

+7

init może być prywatny –

+0

@shanyangqu Następnie możesz użyć ReflectionTestUtils lub odpowiednika na przykład. To jest kod testowy. – mrembisz

Powiązane problemy