当前位置: 首页 > 知识库问答 >
问题:

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

梁丘权
2023-03-14

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

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

在Typescript中,我们可以与多个套件共享beforeach函数,每个套件都可以有自己的beforeach

共有1个答案

林魁
2023-03-14

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

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

     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(测试中的主题)的代码中——这显然不应该在父级的doLaunize方法中,因此Test1Class可能也会有用@前注释的方法(阅读此处了解有关排序等的信息)然后'sut被Spy初始化,坦率地说,这很奇怪恕我直言,测试中的主题应该是您编写的真实类,但这超出了问题的范围,只是提到它,因为它可以指出错误。

附注2

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

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

 类似资料:
  • 因为这个方法是在运行时执行的,所以需要对它进行测试吗

  • 我有一个测试类的testng套件,我正在通过一个testng.xml文件运行它。这个很管用。所有测试都是串行运行的,因此没有并行执行障碍。 当然,通过类成员变量在单个类中的测试方法之间共享状态是很容易的,但是我不知道如何在测试类之间共享状态。

  • 我有两个类 TempResult 和 结果,它们之间需要多对一。临时收割有一个复合键。结果还需要 TempResult 的复合键中的所有属性(一个属性除外)作为其主键。 在TempResult中包含@ManyTone的情况下,如果在@JoinColumn中设置了insertable=false和Updateable=false,则表结构完全正常。但它不允许在TempResult表中创建新条目。如果

  • 执行testng xml时,它在套件中只执行1个测试 基本测试- 登录测试-

  • 类似问题:在Android Studio中的Android工具测试和单元测试之间共享代码 我的设置如下: 包含单元测试的< li> 文件夹。这些可以是Java或Kotlin类 包含仪器测试的< li> 。这些也可以是Java或Kotlin类 < li> 是一个文件夹,其中包含一组在单元测试和测量测试之间共享的实用程序。 这种共享在gradle中定义为: 这允许< code>src/test或< c

  • 问题内容: 我需要创建一个伪的帮助程序类以用于单元测试(注入到测试的类中)。有没有办法在此类中使用TestCase断言? 我想将这些断言用于Fake类执行的一些常见检查。就像是: 问题答案: 您可以创建的实例并在其上调用方法。 在较旧的Python版本(Python 2.7和更早的版本3.0、3.1)上,您需要在类类中传递 现有 方法的名称(通常在子类上传递测试方法的名称)。在这种情况下将: 但是