PowerMock 测试通过然后失败

2024-02-11

为什么我的单元测试在独立运行时通过,但在运行多个测试时失败?

当我执行单个单元测试时,我的测试将成功模拟并返回预期结果。但是,当我运行所有单元测试时,我之前通过的测试将失败。

一次试运行

shouldDoThisAgain() - 通过

多次测试运行

shouldDoThis() - 通过

shouldDoThisAgain() - 失败

shouldDoThisAgainAgain() - 失败

我的测试:

@PrepareForTest({OtherMethods.class})
@PowerMockIgnore("javax.management.*")
@RunWith(PowerMockRunner.class)
public class DbTest {
    @Test
    public void shouldDoThis() throws Exception() {
        Dal dalMock = mock(Dal.class)
        PowerMockito.whenNew(Dal.class).withAnyArguments().thenReturn(dalMock)
        List<Result> results = new ArrayList<Result>();
        results.add(new Result(1,2,3));
        when(dalMock.getResults()).thenReturn(results)
        assertTrue(Wrapper.MY_WRAPPER.run()); 
    }
    @Test
    public void shouldDoThisAgain() throws Exception() {
        Dal dalMock = mock(Dal.class)
        PowerMockito.whenNew(Dal.class).withAnyArguments().thenReturn(dalMock)
        List<Result> results = new ArrayList<Result>();
        results.add(new Result(2,3,4));
        when(dalMock.getResults()).thenReturn(results)
        assertTrue(Wrapper.MY_WRAPPER.run());
    }
    @Test
    public void shouldDoThisAgainAgain() throws Exception() {
        Dal dalMock = mock(Dal.class)
        PowerMockito.whenNew(Dal.class).withAnyArguments().thenReturn(dalMock)
        List<Result> results = new ArrayList<Result>();
        results.add(new Result(6,5,3));
        when(dalMock.getResults()).thenReturn(results)
        assertTrue(Wrapper.MY_WRAPPER.run());
    }
}

我的课程:

public class Wrapper {
    // not Runnable
    public static final MyWrapper MY_WRAPPER = new MyWrapper(...){
        @Override
        public boolean run() {
           // returns empty list when the test is alone
           // returns 'results' variable when ran with other tests alone
           List<Result> results = OtherMethods.getDal().getResults();
           return !results.isEmpty()
        }
    };  
}

public class OtherMethods {
     private static final Logger LOGGER = LogManager.getLogger(OtherMethods.class);

     public static Dal dal;
     
     static Dal getDal() {
         if (dal == null) {
             try {   
                 dal = new Dal();
             } catch (Exception e) {
               LOGGER.fatal("DB Connection could not be created for Geonames");
               LOGGER.fatal(e);
           }
        }
        return dal;
    }
}

我找到了适合我们项目的解决方案。我编写了一个 Logger 类,它调用 Android 的内部静态 Log 方法。我的一些测试并没有直接测试Log类。当我忽略所有这些时,基于 powermockito 的测试变成了绿色。但是当运行这些其他测试时,基于 powermockito 的测试将会失败。有时。

这种方法会失败(不稳定):

@RunWith(PowerMockRunner.class)
@PrepareForTest({Log.class})    // WARNING: HERE BE DRAGONS!
public class MyTest {

    @Test
    public void testMethodThatDoesNotUseStatics() {
        // ...
    }

    @Test
    public void usesStatics() {
        // ...
    }

}

然后我发现你可以用注释每个测试方法@PrepareForTest, 像这样:

@RunWith(PowerMockRunner.class)
public class MyTest {

    @Test
    public void testMethodThatDoesNotUseStatics() {
        // ...
    }

    @Test
    @PrepareForTest({Log.class})    // that's the way :)
    public void usesStatics() {
        // ...
    }

}

现在测试又恢复正常了。非常好的测试! :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerMock 测试通过然后失败 的相关文章

随机推荐

  • 从用户硬盘浏览并选择文件在 IE 中给出未定义

    当我使用输入按钮浏览用户计算机上的文件时 它适用于 FF IE9 和 Chrome 但是当我将文件传递给 IE9 中的 JS 函数时 我得到了未定义的结果 而它在 FF 和 Chrome 中工作得很好
  • 枚举的详尽 switch 语句的静态分析[重复]

    这个问题在这里已经有答案了 考虑以下代码 enum MyEnum A B C int foo MyEnum e switch e case A return 1 case B return 2 case C return 3 error m
  • MPAndoid 图表具有以下样式

    我在我的项目中使用 MPAndroid Chart 我想将 LineChart 的样式设置如下 基本上我想要所有 4 个象限和其他样式 如渐变颜色等 首先通过这样做来填充线条后面的颜色 dataset setDrawFilled true
  • 如何从 STL 容器中获取仅移动类型?

    让我们考虑一个std unordered set of std unique ptr
  • 保存文件后自动启动单元测试

    借助 Ruby on Rails 当我保存代码文件时 我可以使用自动测试来自动运行所有测试 此外 该框架仅启动受更改影响的测试 并通知我测试结果 我使用Eclipse进行java开发有类似的情况吗 我不想要为我生成测试的东西 它只是应该在正
  • 使用 PHP 检索文本区域的值

    有人可能知道如何使用 PHP 获取 HTML 文档中特定元素的值吗 我现在正在做的是使用file get contents从另一个网站提取 HTML 代码 该网站上有一个文本区域
  • 关闭模态并滚动到 div

    contact form click function html body animate scrollTop contact section offset top 2000 div class modal fade div class m
  • 在 ImageButton 中动态更改图像

    XML
  • 使用 Swift 推断类方法中的泛型类型

    泛型方法是否可以根据执行它的类来推断其类型 我使用 CoreData NSManagedObject 模型来存储和检索本地数据 并设法以一种易于阅读和可用的方式使所有内容通用 除了在一个地方 如果用户希望查询本地数据库以获取对象列表 他将编
  • 在c#中添加或删除新记录后刷新gridview

    我的页面上有一个网格 我需要刷新 gridview 添加和删除新记录 但它不是 这是代码 将行添加到 GridView private void AddClientToGrid int clientID int Parse ddlClien
  • <导航> 或 <菜单> (HTML5)

    W3Schools com 并且我很确定我记得看到过 W3C org 声明 menu 应用于工具栏菜单和列表表单控制命令 那么 我的主菜单应该使用哪一个呢 Nav or Menu 有关系吗 nav用于内部链接组 a元素 一般来说 这意味着链
  • PDFBox - 获取单词位置(而不仅仅是字符)

    是否可以使用 PDFBox 获取单词的位置 类似于 processTextPosition 似乎 processTextPosition 仅在单个字符上调用 将它们合并为单词的代码是 PDFTextStripper 在 规范化 中 方法的一
  • PHP SQL:如果变量为空则跳过查询部分的方法

    我正在编写一个查询 该查询使用搜索表单中的输入 其中品牌 类型和价格是可选输入字段 SELECT FROM database WHERE brand LIKE brand AND type LIKE type AND price LIKE
  • 配置选项错误:\377\376h

    我正在将我的系统设置为代码提交 但出现以下错误 我点击了以下链接 https docs aws amazon com codecommit latest userguide setting up ssh windows html https
  • 当服务器发送 HTML 而不是图像数据时,是否可以捕获失败的 IMG 加载?

    我有一个网站链接到其他网站上的不同图像 有时这些图像已被删除或域不再存在等 为了不显示这些图像并删除它们 我使用 jQuery 来执行此操作 catch image load errors img error function read o
  • Swift 1.2 中的 @noescape 属性

    Swift 1 2 中有一个新属性 在函数中带有闭包参数 正如文档所述 这表明 参数仅被调用 或作为 noescape 调用中的参数 这意味着它不能 比调用的生命周期更长 据我了解 在此之前 我们可以使用 weak self 不要让闭包有强
  • 如何从 TFS 控制下的项目中删除空文件夹?

    假设我有一个项目 MyLib 在该项目下 我创建了一个文件夹 例如Folder1 该文件夹下没有文件 该项目已连接到 TFS 然后我想删除这个文件夹Folder1 我从上下文菜单中删除了它 并将项目签入 TFS 然后我使用 Team Exp
  • 传递给函数的原始变量名? [复制]

    这个问题在这里已经有答案了 可能的重复 PHP 获取作为参数传递的变量的名称 https stackoverflow com questions 2379166 php get name of variable passed as argu
  • 服务层是否应该接受来自控制器的 DTO 或自定义请求对象?

    正如标题所示 设计服务层时的最佳实践是什么 我确实理解服务层应该始终返回 DTO 以便域 实体 对象保留在服务层中 但是控制器向服务层的输入应该是什么 下面我提出三点我自己的建议 方法一 在此方法中 域对象 Item 保留在服务层内 cla
  • PowerMock 测试通过然后失败

    为什么我的单元测试在独立运行时通过 但在运行多个测试时失败 当我执行单个单元测试时 我的测试将成功模拟并返回预期结果 但是 当我运行所有单元测试时 我之前通过的测试将失败 一次试运行 shouldDoThisAgain 通过 多次测试运行