JUnit - перед методом

Мне нужно выполнить некоторый фрагмент кода перед каждым тестовым методом JUnit. Чтобы выполнить этот фрагмент кода, я использую класс SpringTest AbstractTestExecutionListener и его дочерний TransactionContextTestExecutionListener.

Это код:

public class TransactionContextTestExecutionListener extends AbstractTestExecutionListener{

    private static final Logger logger = Logger.getLogger(TransactionContextTestExecutionListener.class);


    @Override
    public void beforeTestMethod(TestContext testContext) throws Exception {
        Object ctx = testContext.getApplicationContext().getBean(Context.class);
}

Мой класс JUnit выглядит так:

@ContextConfiguration(locations = "classpath:/META-INF/spring-test/tests-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners(TransactionContextTestExecutionListener.class)
@Transactional
public class SelectQueryBuilderTest {}

Проблема в том, что метод beforeTestMethod вызывается только перед первым выполненным тестовым методом. Он не вызывается перед всеми остальными.

Проблема в конфигурации? Любая идея?

Спасибо


person vlcik    schedule 15.10.2012    source источник
comment
Просто любопытно, пробовали ли вы стандартную аннотацию JUnit @Before?   -  person btiernay    schedule 15.10.2012


Ответы (2)


Я бы посоветовал попробовать @Before. Например, рассмотрите возможность создания базового класса для вашего теста:

@ContextConfiguration(locations = "classpath:/META-INF/spring-test/tests-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners(TransactionContextTestExecutionListener.class) 
@Transactional 
public class BaseQueryBuilderTest {
    @Autowired
    private ApplicationContext applicationContext;
    protected Context context;

    @Before
    public void setUp() {
        context = applicationContext.getBean(Context.class);
    }
} 

И теперь вы можете написать свою тестовую реализацию следующим образом:

public class SelectQueryBuilderTest extends BaseQueryBuilderTest {
    @Test
    public void test() {
        // Use context
    }
}

Одним из преимуществ этого подхода является то, что он инкапсулирует множество метаданных в базовый класс, избавляя вас от необходимости дублировать их во всех реальных тестовых классах.

person btiernay    schedule 15.10.2012

Поскольку вы используете свой класс JUnit с SpringJUnit4ClassRunner, вы можете использовать аннотации JUnit 4:

@Before
public void multipleInit() {
    // Called before each method annotated with @Test
    ...
}

@BeforeClass
public static void initAll() {
    // Called once per class, before any method annotated with @Test is called
    ...
}
person Romain Linsolas    schedule 15.10.2012
comment
Кроме того, если вы вручную аннотируете метод с помощью @BeforeClass или @AfterClass, сделайте эти методы статическими. - person Sudoss; 12.07.2019