Junit 有没有办法在测试套件类之间共享@Before代码?

Junit 有没有办法在测试套件类之间共享@Before代码?,junit,junit4,Junit,Junit4,我正在用Java/Android测试Cordova插件,在运行测试之前,我需要初始化我的插件类并设置一些状态 @Before public void beforeEach() throws Exception { System.out.println("Creating new Instance "); PowerMockito.mockStatic(Helpers.class); PowerMockito.when(Helpers.canUseStorage(

我正在用Java/Android测试Cordova插件,在运行测试之前,我需要初始化我的插件类并设置一些状态

  @Before
  public void beforeEach() throws Exception {
    System.out.println("Creating new Instance ");

    PowerMockito.mockStatic(Helpers.class);
    PowerMockito.when(Helpers.canUseStorage(any(), any())).thenReturn(true);

    MyLogger myLoggerMock = PowerMockito.mock(MyLogger.class);
    PowerMockito.doNothing().when(myLoggerMock, "log", anyString());

    PowerMockito.whenNew(MyLogger.class).withAnyArguments().thenReturn(myLoggerMock);

    this.sut = spy(new FilePicker());
    PowerMockito.doNothing().when(this.sut).pick(any(), any());
  }
我想为每个公共函数创建一个测试套件/Java类,但我不想每次都重复该代码

是否有一种方法可以在每个测试套件之间进行共享?我发现了,但我认为我没有做我需要的事情(或者我理解错了……我对Java真的很陌生)


在Typescript中,我们可以与多个套件共享
beforeach
函数,每个套件都可以有自己的
beforeach
一种可能的方法是使用继承:

使所有测试类从一个“父测试”类扩展,并在父类中定义一个
@之前的
。
因此,它将自动为所有子类调用:

公共类ParentTest{
@以前
公共空间初始化(){
....
}
}
公共类Test1Class扩展了父类{
@试验
公共空间{
//doInitialization将在此方法之前执行
}
@试验
公共物品交换(){
//doInitialization也将在此方法之前执行
}
}
注二:

注1

在您使用的
sut
(受试者)代码中-这显然不应该出现在家长的
doInitialization
方法中,因此
Test1Class
可能也会有在
@之前注释了
@的方法(阅读了解有关排序等信息)
然后用Spy初始化sut,坦白说这很奇怪,IMHO,被测试的主题应该是您编写的真实类,但这超出了问题的范围,仅提及它是因为它可能会指出错误

注2

我写这篇文章是为了帮助你,因为你说你是Java新手,这与你的问题没有严格的关系

虽然这种方法在一般情况下是有效的,但您应该对PowerMockito非常谨慎。我不是PowerMockito专家,我试图在代码中避免这种类型的模拟,但简而言之,它处理字节码的方式可能与其他工具发生冲突。从您的代码:您可以将
HelperUtils
重构为非静态的,从而避免使用powermock,而使用更快速、更安全的常规mock。
至于日志记录-通常您可以在单元测试中对其进行折衷,如果您使用slf4j库,您可以将其配置为使用“no op”日志进行测试,例如将所有日志记录消息发送到“nothing”中,并且在控制台中看不到它们。

感谢您的评论,它们确实帮助了我!我知道这个测试看起来很奇怪。帮手的问题是,我不能真正把它注入我的课堂。框架(Cordova)创建了新实例,我不能在那里注入任何依赖项。另外,我正在监视我的
sut
,因为在那里我只想测试一个函数
execute
,我不想添加
pick
函数所需的模拟,所以我想阻止测试调用它。我还没有找到其他方法来做这件事。也许这就是为什么我没有找到任何带有单元测试的Android Cordova插件的原因。。。