簡體   English   中英

EasyMock + PowerMock:如何模擬字段?

[英]EasyMock + PowerMock : How to mock field?

讓我們看一下這段代碼:

    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 = new B(); 並且我想測試b.doSmthElse() ,但是我之前需要為a_instance對象創建一個模擬,否則我將得到NullPointerException 如何使用EasyMock或PowerMock實現此目標?

@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);
    }

您可以使用

instanceName.methodName();
Easymock.expectLastCall(); //for void methods this is how it is done

instanceName可以是模擬的,也可以是actualInstance。

如果您可以將方法設為靜態,那么使用powermock會更容易

Powermock.mockStatic(ClassNameContainingStaticMethod)

所有靜態方法都直接被模擬

告誡:-將方法轉換為靜態方法在其他部分可能會有問題,請謹慎執行

希望能幫助到你。 祝一切順利!

我看不到為什么需要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
}

注意:導入適當的類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM