【问题标题】:Is there a way to share @Before code between tests suite classes?有没有办法在测试套件类之间共享@Before 代码?
【发布时间】:2019-10-31 19:03:06
【问题描述】:

我正在 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 类,但我不想每次都重复该代码。

有没有办法在每个测试套件之间共享?我找到了ClassRule,但我认为我没有做我需要做的事情(或者我理解错了......我真的是 Java 新手)

在 Typescript 中,我们可以与多个套件共享beforeEachfunctions,每个套件可以有自己的beforeEach

【问题讨论】:

    标签: junit junit4


    【解决方案1】:

    一种可能的方法是使用继承:

    使所有测试类从一个“父测试”类扩展并在父类中定义一个@Before。 所以它会被所有子类自动调用:

         public class ParentTest {
    
             @Before
             public void doInitialization() {
              ....
             }
         }
    
         public class Test1Class extends ParentClass {
    
             @Test
             public void fooTest() {
              // doInitialization will be executed before this method
             }
    
             @Test  
             public void barTest() {
               // doInitialization will be executed before this method as well
             }
         }
    

    两个音符:

    注 1

    在您使用sut(被测对象)的代码中 - 这显然不应该出现在父级的doInitialization 方法中,因此Test1Class 也可能有带有@Before 注释的方法(阅读@987654321 @获取有关订购等的信息) 然后 `sut 用 Spy 初始化,坦率地说这很奇怪,恕我直言,被测主题应该是你写的一个真实的类,但这超出了问题的范围,只是提到它,因为它可以指出错误。

    注2

    我写它是为了提供帮助,因为你说你是 Java 新手,这与你的问题并不严格相关......

    虽然这种方法通常有效,但您应该对 PowerMockito 非常谨慎。我不是 PowerMockito 专家,并尝试在我的代码中避免这种类型的模拟,但简而言之,它操作字节码的方式可能与其他工具发生冲突。从您的代码中:您可以将 HelperUtils 重构为非静态的,从而避免 PowerMocking 以支持更快、更安全的常规模拟。 至于日志 - 通常你可以在单元测试中妥协,如果你使用 slf4j 库,你可以将它配置为使用“no-op”日志进行测试,比如将所有日志消息发送到“nothing”,而不是- 在控制台中看到它们。

    【讨论】:

    • 感谢您的 cmets 他们真的帮助了我!我有点知道测试看起来(并且)很奇怪。 Helpers 的问题是我无法真正将它注入我的课堂。框架(Cordova)创建了新实例,我不能在那里注入任何依赖项。我也在监视我的sut,因为在那里我只想测试一个函数execute,我不想添加pick 函数所需的模拟,所以我想阻止测试调用它。我还没有找到其他方法来做到这一点。也许这就是为什么我没有找到任何带有单元测试的 Android Cordova 插件的原因......
    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多