使用Mockito在被注入的服务类中注入对象



我正在尝试为JavaEE7应用程序中的服务编写一个JUnit测试。被测试的服务类会注入另一个服务类,而服务类又会注入另一个类。以下是我的课程简介:

class ServiceA {
   ServiceB serviceB;
   public void methodA() {
     serviceB.methodB();
   }
}
class ServiceB {
   @Inject
   ServiceC serviceC;
   public void methodB() {
      serviceC.methodC();
   }
}
class ServiceC {
   public void methodC() {}
}
class TestServiceA {
   @Spy
   ServiceA serviceA;
   @InjectMocks
   ServiceB serviceB;
   @Before
   public void setUp() {
      serviceA.serviceB = mock(ServiceB.class);
   }
   @Test
   public void testServiceA() {
      serviceA.methodA();
   }
}

编辑:从原来的记录器问题编辑为一般对象问题。问题是,是否有可能或有必要在测试中注入多个级别的对象,或者我是否应该只模拟第一个注入的服务,并使用when-Expressions捕获对后续服务的所有方法调用?

您的目标是测试实例,当您使用serviceA.methodA()时,是否真的调用了methodB。

下面的代码是这样做的:
import javax.inject.Inject;
public class ServiceA {
    @Inject
    ServiceB serviceB;
    public void methodA() {
        serviceB.methodB();
    }
}
import javax.inject.Inject;
public class ServiceB {
    @Inject
    Logger log;
    public void methodB() {
        log.debug("log message");
    }
}
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
public class ServiceTest {
    /**
     * Create an instance of the class ServiceA.
     */
    @InjectMocks
    private ServiceA serviceA;
    /**
     * Create a fake instance of ServiceB.
     */
    @Mock
    private ServiceB serviceB;
    /**
     * Create a fake instance of Logger.
     */
    @Mock
    private Logger log;
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    /**
     * Verify that methodB is called.
     */
    @Test
    public void testServiceA() {
        serviceA.methodA();
        verify(serviceB, times(1)).methodB();
    }
}

这里,Logger也必须是mock,否则您将得到一个NPE。

相关内容

  • 没有找到相关文章

最新更新