Java 带有Serenity的Spring参数化JUnit测试

Java 带有Serenity的Spring参数化JUnit测试,java,junit,serenity-bdd,thucydides,Java,Junit,Serenity Bdd,Thucydides,我正在寻找如何在使用JUnit runner的serenity bdd frameworkk中使用spring集成的解决方案。 问题是我不能在测试数据收集方法中使用方法,因为它是静态的 我用了那根线的一些鞍子,但不起作用。 也许我在解释中遗漏了什么。 @RunWith(SerenityParameterizedRunner.class) @并发(threads=“5”) 公开课演奏测试{ 私人玩家; 公共玩家测试(玩家){ this.player=player; } @注入 PlayerSer

我正在寻找如何在使用JUnit runner的serenity bdd frameworkk中使用spring集成的解决方案。 问题是我不能在测试数据收集方法中使用方法,因为它是静态的

我用了那根线的一些鞍子,但不起作用。 也许我在解释中遗漏了什么。

@RunWith(SerenityParameterizedRunner.class)
@并发(threads=“5”)
公开课演奏测试{
私人玩家;
公共玩家测试(玩家){
this.player=player;
}
@注入
PlayerService PlayerService;
@测试数据
公共静态集合testData(){
returnplayerservice.getPlayers()
.stream()
.map(它->新对象[]{it})
.collect(Collectors.toList());
}
@台阶
反馈步骤反馈步骤;
@试验
@标题(“检查玩家数据”)
公共void testPlayer(){
feedsSteps.checkPlayer(玩家);
}
}
基本上,一切看起来都不错,但我不能使用playerService,因为testData
它是静态的。我试图找到一些解决方案,如何使用我的服务中的方法。

终于找到了解决我问题的方法。 问题是,在静态方法中收集测试数据之前,您需要初始化spring上下文,然后才能注入它。 每次测试后,测试将如下所示:

@RunWith(SerenityParameterizedRunner.class)
@Concurrent(threads = "5")
public class PlayerTest {

    private Player player;
    private static PlayerService playerService;

    public PlayerTest (Player player) {
        this.player = player;
    }

    private static synchronized void initBeans() {
        if(context == null)
        {
            context = new AnnotationConfigApplicationContext("com.package.service");
        }
        playerService = context.getBean(PlayerServiceImpl.class);
    }

    @TestData
    public static Collection<Object[]> testData() {
        return playerService.getPlayers()
                .stream()
                .map(it -> new Object[]{it})
                .collect(Collectors.toList());
    }

    @Steps
    FeedsSteps feedsSteps;

    @Test
    @Title("Check player data")
    public void testPlayer() {
        feedsSteps.checkPlayer(player);
    }

}
@RunWith(SerenityParameterizedRunner.class)
@并发(threads=“5”)
公开课演奏测试{
私人玩家;
私有静态PlayerService PlayerService;
公共玩家测试(玩家){
this.player=player;
}
私有静态同步void initBeans(){
if(上下文==null)
{
context=newannotationConfigApplicationContext(“com.package.service”);
}
playerService=context.getBean(PlayerServiceImpl.class);
}
@测试数据
公共静态集合testData(){
returnplayerservice.getPlayers()
.stream()
.map(它->新对象[]{it})
.collect(Collectors.toList());
}
@台阶
反馈步骤反馈步骤;
@试验
@标题(“检查玩家数据”)
公共void testPlayer(){
feedsSteps.checkPlayer(玩家);
}
}

终于找到了解决我问题的方法。 问题是,在静态方法中收集测试数据之前,您需要初始化spring上下文,然后才能注入它。 每次测试后,测试将如下所示:

@RunWith(SerenityParameterizedRunner.class)
@Concurrent(threads = "5")
public class PlayerTest {

    private Player player;
    private static PlayerService playerService;

    public PlayerTest (Player player) {
        this.player = player;
    }

    private static synchronized void initBeans() {
        if(context == null)
        {
            context = new AnnotationConfigApplicationContext("com.package.service");
        }
        playerService = context.getBean(PlayerServiceImpl.class);
    }

    @TestData
    public static Collection<Object[]> testData() {
        return playerService.getPlayers()
                .stream()
                .map(it -> new Object[]{it})
                .collect(Collectors.toList());
    }

    @Steps
    FeedsSteps feedsSteps;

    @Test
    @Title("Check player data")
    public void testPlayer() {
        feedsSteps.checkPlayer(player);
    }

}
@RunWith(SerenityParameterizedRunner.class)
@并发(threads=“5”)
公开课演奏测试{
私人玩家;
私有静态PlayerService PlayerService;
公共玩家测试(玩家){
this.player=player;
}
私有静态同步void initBeans(){
if(上下文==null)
{
context=newannotationConfigApplicationContext(“com.package.service”);
}
playerService=context.getBean(PlayerServiceImpl.class);
}
@测试数据
公共静态集合testData(){
returnplayerservice.getPlayers()
.stream()
.map(它->新对象[]{it})
.collect(Collectors.toList());
}
@台阶
反馈步骤反馈步骤;
@试验
@标题(“检查玩家数据”)
公共void testPlayer(){
feedsSteps.checkPlayer(玩家);
}
}