【问题标题】:Unit tests, Mock objects in Debug and in Run modes单元测试,Debug 和 Run 模式下的 Mock 对象
【发布时间】:2020-04-01 11:42:14
【问题描述】:

我正在开发单元测试。 如果我在运行模式下开始测试,运行失败并显示消息:

如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串"); 使用匹配器时,所有参数都必须由匹配器提供。 例如: //正确的: someMethod(anyObject(), eq("匹配器的字符串")); 有关更多信息,请参阅 Matchers 类的 javadoc。

如果我在调试模式下使用 String tableName = table.getTableName() 上的断点运行测试,则测试顺利通过。停止发生在断点处。

@Test
void myTest() {
    Table table = mock(Table.class);
    when(table.getTableName()).thenReturn("mytableName")
    SQLService service = new SQLService(table);
    service.select();
}

class SQLService {
    private final Table table;
    SQLService(Table table) {
         this.table = table;
    }

    void select() {
        String tableName = table.getTableName(); // <---- issue here, breakpoint is set on this line
        ........    
    }
}

【问题讨论】:

  • 我使用org.mockito.Mockito 效果很好

标签: java junit


【解决方案1】:

此问题是由于将匹配器与原始值混合造成的。如果您使用匹配器,那么您需要对所有参数使用匹配器。

尝试使用 .eq() 匹配器,你的代码是这样的:

when(Mockito.eq(table.getTableName())).thenReturn("mytableName");

【讨论】:

  • 你知道为什么测试在Debug模式+断点通过,而在Run模式不通过吗?
  • “停止发生在断点上” - 我认为这意味着测试停止?无论哪种方式,您都需要在没有调试模式的情况下通过测试 - 您是否尝试过使用 .eq()?
  • 是的,我尝试使用它,我得到了:正确使用参数匹配器的示例:when(mock.get(anyInt())).thenReturn(null); doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());验证(模拟).someMethod(包含(“foo”))
  • PC:测试在调试点停止,我按下运行(继续执行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多