【问题标题】:Method getting mocked but Value not correctly returned方法被嘲笑但值未正确返回
【发布时间】:2014-08-26 05:55:00
【问题描述】:

我正在尝试对我的班级进行单元测试 这看起来像:-

   class A{
       private void method1(){
          B b=new B();
          C c=b.method2();
          if(c!=null){
             ...
             ...
          }
       }
}

我想在 B 类中模拟“method2()”。 我知道我们需要一个 B() 的模拟对象,这样每当我们调用它的方法时,就会发生模拟。 这是我尝试过的

A aMock=Easymock.createNiceMock(A.class);
B bMock=Easymock.createNiceMock(B.class);
Powermock.expectNew(B.class).andReturn(bMock).anyTimes();
Easymock.expect(bMock.method2()).andReturn(new C()).anyTimes();
//have done all the replays and verifies

并使用aMock.method1() 调用它, 现在主要问题是 method2 被嘲笑(即 method2() 的主体没有被执行)但我无法接收 C 的对象作为对此的响应。

我的测试场景是:-

我想测试 A 类的 method1() ,它又调用 B 类的 method2() ,但我不希望它执行它的代码(method2() ),因为它是一个 DB 调用,我也需要method2() 返回的 C 对象,所以我使用模拟来实现这一点。

【问题讨论】:

  • 那么发生了什么? “我无法接收 C 的对象”是什么意思?
  • 预期的行为是模拟应该返回 C 类型的新对象(正如我所写的“.andReturns(new C()))”而不是返回 null
  • 对,这个问题根本不清楚 - 请编辑它以使其更清楚。另外,请显示为您的测试指定的任何属性,并告诉我们更多关于您的测试是如何运行的。 (JUnit 4?还有别的吗?)
  • 已编辑问题!添加了我的测试场景
  • 这并没有向我们显示测试的任何注释,或者您如何运行测试。理想情况下,展示一个简短但完整的问题示例。 (它不需要做任何数据库调用......只需要一个 B 类,它的方法会打印“这不应该被打印”。)

标签: java unit-testing junit4 powermock easymock


【解决方案1】:

如果您想测试 A 类的 method1(),那么您不应该创建 A 的模拟。这意味着你不应该这样做A aMock=Easymock.createNiceMock(A.class);

对于您的测试场景,测试将类似于:

import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class ATest {

    A testableA = new A();

    @Test
    public void testMethod1() throws Exception {
        B bMock = EasyMock.createNiceMock(B.class);
        PowerMock.expectNew(B.class).andReturn(bMock).anyTimes();
        EasyMock.expect(bMock.method2()).andReturn(new C()).anyTimes();
        PowerMock.replay(B.class);
        EasyMock.replay(bMock);

        testableA.method1();

        //assert and validate your scenario here
    }
}

您可以关注文档here

【讨论】:

  • 如果我需要模拟 A 的其他一些方法,他们不会被模拟
  • 以上内容应该足以满足您在问题中提到的测试场景。你有额外的要求吗?你能在代码中给出细节吗?
  • @Vihar1903 对于附加场景,您可以额外使用 mockito 提供的部分模拟。这很适合上面的测试用例。详情在这里:code.google.com/p/powermock/wiki/MockPartial
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 2020-07-21
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2022-12-07
  • 2016-10-25
相关资源
最近更新 更多