Java EasyMock+PowerMock:如何模拟场地?

Java EasyMock+PowerMock:如何模拟场地?,java,unit-testing,testng,easymock,powermock,Java,Unit Testing,Testng,Easymock,Powermock,让我们看看这段代码: public class A { public void doSmth() { // pay attention - void method // impl } } public class B { private A a_instance; // null public void doSmthElse() { a_instance.doSm

让我们看看这段代码:

    public class A {

        public void doSmth() {  // pay attention - void method
           // impl
        }
    }

    public class B {
       private A a_instance; // null

       public void doSmthElse() {
          a_instance.doSmth(); // NPE here without mock
          // also do smth. else
       }
    }

现在,我有了B=新的B;我想测试b.doSmthElse,但之前我需要为一个_实例对象创建一个mock,否则我会得到NullPointerException!如何使用EasyMock或PowerMock实现这一点

我看不出这里需要PowerMock的原因。您可以通过EasyMock本身实现这一点

@Test
public void testDoSmthElse() {
    A a = EasyMock.createMock(A.class);
    EasyMock.expect(a.doSmth()).andReturn(/*some value */);
    EasyMock.replay(a);

    B b = new B();
    Object whatever = b.doSmthElse();

    assert(); // psuedo-line. Add whatever assertion required
}
注意:导入您可以使用的适当类

instanceName.methodName();
Easymock.expectLastCall(); //for void methods this is how it is done
instanceName可以是Mock或Realization

如果您可以使方法静态化,那么使用powermock会更容易

Powermock.mockStatic(ClassNameContainingStaticMethod)
所有静态方法都直接被模拟

警告:-将方法转换为静态可能会在其他部分出现问题。请小心操作

希望能有帮助。
祝你一切顺利

你试过什么?您正在使用依赖项注入库或框架吗?什么意思?是的,在现实生活中,一个_实例对象被注入其中,但对于单元测试,我需要模拟它;没有必要。只需将该行替换为a.doSmth;在调用B.dosmthelset之前,你需要将对象A注入到B中,然后我需要为A_实例使用setter方法,我的意思是setter方法,我只用于测试目的。例如,在包含一些业务逻辑的类中使用只用于测试的代码不是很好的做法。这是一个不同的问题,有许多不同的解决方案。您可以公开协作者,使用反射设置它,或者使用Spring之类的实用程序。不,反射不起作用,因为我使用EasyMock为B类创建mock,这就是为什么如果我尝试使用反射获取该字段,我将得到NoSuchFieldException,因为我不知道在创建模拟时如何调用该字段。您不需要使用EasyMock来创建B实例—这是您的sut,只需创建A模拟即可。若你们并没有一个公共setter,这就意味着你们正在使用一个框架来注入一个实例,而fwk肯定会使用反射。然后,您还必须在测试中使用反射。我会更新我的答案。
@Test
public void testDoSomething()
    {
    // setup: sut
    B b = new B();
    A mockA = EasyMock.createMock(A.class);
    b.setA_instance(mockA); // If you have a setter

    // setup: expectations
    mockA.doSmth();

    // exercise
    EasyMock.replay(mockA);
    b.doSmthElse();

    // verify
    EasyMock.verify(mockA);
    }

@Test
public void testDoSomething_setUsingReflection()
    {
    // setup: sut
    B b = new B();
    A mockA = EasyMock.createMock(A.class);
    // Set the collaborator using a Spring reflection utility
    ReflectionTestUtils.setField(b, "a_instance", mockA);

    // setup: expectations
    mockA.doSmth();

    // exercise
    EasyMock.replay(mockA);
    b.doSmthElse();

    // verify
    EasyMock.verify(mockA);
    }