【问题标题】:How to mock a dependency declared in the parent abstract class using Mockito? [duplicate]如何使用 Mockito 模拟在父抽象类中声明的依赖项? [复制]
【发布时间】:2019-12-04 16:35:09
【问题描述】:

我有两个类,Parent 和 Child,并且想使用 Mockito 对 Child 类中的一些方法进行单元测试。

public abstract class Parent {

  @Resource Service service;

}
@Service // spring service
public class Child extends Parent {

   private AnotherService anotherService;

   @Autowired
   Child(AnotherService anotherService) {
      this.anotherService = anotherService;
   }

   public boolean someMethod() {
   }
}

我的测试类如下所示:

@RunWith(MockitoJUnitRunner.class)
public class ChildTest {
   @Mock
   Service service;

   @Mock
   AnotherService anotherService;

   @InejctMocks
   Child classToTest;

   @Test
   public void testSomething() {
      assertTrue(classToTest.someMethod());
   }
}

而我面临的问题是 anotherService 被正确地模拟,但 servicenull。有人可以告诉我如何在我的测试类中成功模拟这两个服务(依赖项)吗?

【问题讨论】:

  • 如何实例化 Child?您如何设置/取消依赖项?
  • 这实际上与父/子结构无关。相反,它与您使用字段注入有关,而不是构造函数注入。
  • @MaciejKowalski 这是一个 Spring bean。也编辑了问题。感谢您指出这一点。
  • 我对你在测试中的表现更感兴趣。你使用 InjectMocks 吗?
  • @Michael 你能详细说明一下吗?子类中的依赖使用的是构造函数注入,而不是字段注入。

标签: java mockito


【解决方案1】:

在测试中,类添加这个并尝试

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

【讨论】:

  • 我试过用这个。模拟已正确初始化,但是当我尝试在方法上使用 verify() 时,出现未调用错误。换句话说,这些模拟不会调用方法。
  • 使用MockitoJUnitRunner时不需要这样做。它为你做。
  • 尝试@InjectMock 服务
【解决方案2】:

如果你使用 Spring:

   @SpringBooTest
   @RunWith(SpringRunner.class)
   @MockBean(Resource.class)
   class TestClass{
        @Autowire
        private Resource resource;

        @Autowire
        private Service service;
        
        @Test
        public void test(){
           Mockito.when(resource).getSomething(Mockito.any(),Mockito.any()).thenThrow(new RuntimeException(""));

           service.doSomething();  
        }
    
   }

您可以使用 Mockito:

// Or use MockitoAnnotations.initMocks(testClass); in before method instead rule
@RunWith(MockitoJUnitRunner.class) 
class TestClass{
     @Mock
     Resource resource;

     @InjectMocks 
     Service service;

     @Test
     public void test(){
           Mockito.when(resource).getSomething(Mockito.any(),Mockito.any()).thenThrow(new RuntimeException(""));

           service.doSomething();  
     }
}

【讨论】:

  • 为什么@InjectMocks 服务?我不是在测试服务,而是在测试 Child 类。
  • @Compzets 只需将我的资源替换为您的服务,将我的服务替换为您的 classToTest。在您的父类服务字段中是否在测试方法中等于 null?或者它在你的 classToTest 中是否等于 null。我想一个在测试类中为空。因为你的@Resource Service service 从未被初始化过。
  • 此答案中的语法无效。此代码无法编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多