@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
}
}
Comment puis-je avoir mon service déjà injecté dans la classe d'initialisation statique?
Il me semble que vous essayez de remplir DB avant les tests.
Je voudrais essayer deux options:
@Sql
@DatabaseSetup
Et @DatabaseTearDown
Qui feront la chose dont vous avez besoin sur la base de donnéesJe sais que cela ne répond pas à la façon d'injecter du bean dans du statique @BeforeClass
Mais le code du formulaire semble résoudre votre problème.
Mise à jour: J'ai récemment rencontré le même problème dans mon projet et j'ai creusé cet article qui m'a aidé et je pense qu'il est élégant façon de traiter ce type de problème. Vous pouvez étendre SpringJUnit4ClassRunner
Avec un écouteur qui peut effectuer la configuration au niveau de l'instance avec tous vos beans définis.
Une solution de contournement que j'utilise pour que cela fonctionne est d'utiliser @Before
avec un indicateur pour ignorer son exécution pour chaque 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;
}
}
}
Pour répondre à cette question, nous devons récapituler les versions Spring 2.x.
Si vous voulez "câbler automatiquement" un bean dans votre classe @BeforeTest
, Vous pouvez utiliser l'interface ApplicationContext
. Voyons un exemple:
@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);
}
Ce qui se passe: en utilisant le ClassPathXmlApplicationContext
nous instancions tous les beans contenus dans le fichier application-context.xml
.
Avec context.getBean()
nous lisons le bean spécifié (il doit correspondre au nom du bean!); puis vous pouvez l'utiliser pour votre initialisation.
Vous devez donner un autre nom au bean (c'est le dao2
!) Sinon Spring "autowired" normal ne peut pas fonctionner sur le bean prédéfini.
En remarque, si votre test étend AbstractTransactionalJUnit4SpringContextTests
, Vous pouvez faire une initialisation en utilisant executeSqlScript(sqlResourcePath, continueOnError)
; , donc vous ne dépendez pas d'une classe/méthode que vous devez également tester séparément.
UPD pour les versions Spring 2.x.
Spring 2.x prend en charge la nouvelle fonctionnalité SpringExtension
pour Junit 5 Jupiter, où tout ce que vous avez à faire est de:
Déclarez votre classe de test avec @ExtendWith(SpringExtension.class)
Injectez votre @BeforeAll
(remplacement pour @BeforeClass
dans JUnit 5) avec le bean
Par exemple:
@ExtendWith(SpringExtension.class)
...
public void ITest {
@BeforeAll
public static void init(@Autowired EntityRepository dao) {
dao.save(initialEntity);
}
}
En supposant que vous avez correctement configuré JUnit 5 Jupiter avec Spring 2.x
Plus d'informations à ce sujet ici: https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testcontext-junit-jupiter-extension