web-dev-qa-db-fra.com

Comment câbler automatiquement le champ dans @BeforeClass statique?

@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?

31
membersound

Il me semble que vous essayez de remplir DB avant les tests.

Je voudrais essayer deux options:

  • Si vous pouvez extraire les scripts initiaux dans un fichier sql (si c'est une option pour vous sans utiliser de bean de référentiel), vous pouvez utiliser cette approche et annoter votre test avec @Sql
  • Vous pouvez explorer DbUnit et voici lien vers le connecteur à ressort dbunit qui fait exactement cela et vous aide à remplir DB avant les tests. Voici un lien github pour l'intégration entre le framework de test de ressort et dbunit. Après cela, vous avez @DatabaseSetup Et @DatabaseTearDown Qui feront la chose dont vous avez besoin sur la base de données

Je 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.

8
Nenad Bozic

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;
    }
  }
}
16
Narain Mittal

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.

3
musikele

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:

  1. Déclarez votre classe de test avec @ExtendWith(SpringExtension.class)

  2. 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

0
yeralin