有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java阻止函数在mocking时在构造函数中被调用,Mockito?

我有一个类,当被构造时,它不能调用某个方法

public class ClassA() {
    @NonNull
    private ClassB b;

    public ClassA() {
        this.b = (new ClassC()).mymethod();
    }
}

我需要在不调用ClassC()的情况下测试ClassA。mymethod(),因为调用它将引发错误。这样做的最佳方法是什么?我用@Mock ClassC为ClassA尝试了@injectmock,但它给了我null异常


共 (2) 个答案

  1. # 1 楼答案

    你必须重构你的类,使其更易于测试。下面截取的代码中的另外两个构造函数可用于ClassC或ClassB的模拟测试:

    public class ClassA() {
    
        @NonNull
        private ClassB b;
    
        public ClassA {
           this(new ClassC());
        }
    
        public ClassA(ClassC c) {
            this(c.mymethod());
        }
    
        public ClassA(ClassB b) {
            this.b = b;
        }
    }
    

    示例测试用例:

    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    
    import org.junit.Test;
    
    public class ClassATest {
    
      @Test
      public void test() {
    
        ClassB b = mock(ClassB.class);
        // ... setup your mock for b
    
        ClassC c = mock(ClassC.class);
        when(c.mymethod()).thenReturn(b);
    
        ClassA a = new ClassA(c);
        // ... call the method of "a" you want to test
      }
    }
    
  2. # 2 楼答案

    可以使用CALLS_REAL_METHODS来避免调用ClassA的构造函数

    @RunWith(MockitoJUnitRunner.class)
    public class ClassATest {
    
        @Mock
        private ClassB b;
    
        private ClassA classA;
    
        @Before
        public void setUp() {
            classA = mock(ClassA.class, org.mockito.Mockito.CALLS_REAL_METHODS);
            whitebox.setInternalState(classA, "b", b);
        }
    
       @Test
       public void shouldDoSomething() {
           // your test
       }
    }