2015-03-30 9 views
22
@RunWith(SpringJUnit4ClassRunner.class) 
public void ITest { 
    @Autowired 
    private EntityRepository dao; 

    @BeforeClass 
    public static void init() { 
     dao.save(initialEntity); //not possible as field is not static 
    } 
} 

W jaki sposób mogę wstrzyknąć moją usługę już w statycznej klasie init?Jak wyposażyć pole w static @BeforeClass?

+3

To blogu może pomóc - http: //saltnlight5.blogspot .in/2012/09/enhancer-spring-test-framework-with.html – Mithun

Odpowiedz

7

Wygląda na to, że próbujesz wypełnić DB przed testami.

dałbym szansę na dwie opcje:

  • Jeśli można wyodrębnić początkowe skrypty do SQL pliku (jeśli jest to opcja dla Ciebie bez użycia repozytorium fasola), można użyć this approach i opisywanie test z @Sql
  • Możesz zbadać DbUnit i tutaj jest link to spring dbunit connector, który robi dokładnie to i pomaga wypełnić DB przed testami. Oto github link dla integracji pomiędzy ramą testu sprężystości i dbunit. Po to zrobić masz @DatabaseSetup i @DatabaseTearDown który zrobi coś na DB trzeba

wiem, że to nie odpowiada, jak wstrzyknąć fasoli w statycznym @BeforeClass ale kod forma wygląda to rozwiązuje problem.

Aktualizacja: Niedawno napotkasz ten sam problem w moim projekcie i wykopane this article który pomógł mi i myślę, że jest elegancki sposób radzenia sobie z tego typu problemem. Możesz rozszerzyć SpringJUnit4ClassRunner za pomocą detektora, który może wykonać konfigurację poziomu instancji z wszystkimi zdefiniowanymi ziarnami.

2

Aby odpowiedzieć na to pytanie, powinniśmy podsumować wersje Spring 2.x.

Jeśli chcesz "wyposażyć" komponent bean w klasę @BeforeTest, możesz użyć interfejsu ApplicationContext. Zobaczmy przykład:

@BeforeClass 
    public static void init() { 
     ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml"); 
     EntityRepository dao2 = (EntityRepository) context.getBean("dao"); 
     List<EntityRepository> all = dao2.getAll(); 
     Assert.assertNotNull(all); 
    } 

Co się dzieje: używając ClassPathXmlApplicationContext jesteśmy każdy węzeł wszystkie ziaren zawartych w pliku application-context.xml.

Z context.getBean() odczytujemy określony komponent bean (musi on pasować do nazwy komponentu bean!); a następnie możesz go użyć do inicjalizacji.

Powinieneś nadać fasolce inną nazwę (to jest dao2!) W przeciwnym razie Spring normal "autowired" nie może działać na predefiniowanym komponencie bean.

Na marginesie, jeśli test rozszerza się na AbstractTransactionalJUnit4SpringContextTests, można przeprowadzić inicjalizację za pomocą executeSqlScript(sqlResourcePath, continueOnError); Metoda ta nie zależy od klasy/metody, którą należy również osobno przetestować.

+0

Nie mogę utworzyć instancji 'ApplicationContext', ponieważ również używam' @ IntegrationTest' do automatycznego wypisywania moich normalnych klas @ @ EnableAutoConfiguration' podczas testu (konfiguracja oparta na adnotacjach). – membersound

+0

Dlaczego więc nie używasz 'executeSqlScript'?Jest to statyczna metoda, którą można uzyskać bezpłatnie po rozszerzeniu klasy 'AbstractTransactionalJUnit4SpringContextTests'. – musikele

+0

Pytanie to oczywiście tylko przykład. Równie dobrze mógłbym wykonać każdą logikę w @BeforeClass, nie tylko inicjowanie bazy danych ... – membersound

9

Jeden obejście że używam uzyskać tej pracy jest użycie @Before z flagą, aby pominąć to wykonywane dla każdego testcase

@RunWith(SpringJUnit4ClassRunner.class) 
public class BaseTest { 

@Autowired 
private Service1 service1; 

@Autowired 
private Service2 service2; 

private static boolean dataLoaded = false; 

@Before 
public void setUp() throws Exception { 

    if (!dataLoaded) { 
     service1.something(); 
     service2.somethingElse(); 
     dataLoaded = true; 
    } 
    } 
} 
+2

Wciąż to robię, ale tak naprawdę musi być lepszy sposób, szczególnie, gdy polegasz na polu wstrzykniętym/autowired, ponieważ w takim przypadku '@ BeforeClass' nie będzie działał. – carlspring

+0

Co z częścią @AfterClass po wykonaniu testów. Jakąkolwiek strategię, aby zachować prostotę tej pierwszej części? – emecas