简体   繁体   English

没有构造函数时,如何连接Mockito模拟?

[英]How can Mockito mocks be wired when there is no constructor?

I was going through this tutorial which sets up the SUT using a constructor but my question is what if there is no constructor eg if we have: 我正在阅读本教程该教程使用构造函数设置SUT,但是我的问题是,如果没有构造函数,例如,如果我们有:

@Autowire private PetRepository petRepository;
@Autowire private VetRepository vetRepository;
@Autowire private OwnerRepository ownerRepository;
@Autowire private VisitRepository visitRepository;

in the service/controller. 在服务/控制器中。 How we can set this up? 我们该如何设置?

I prefer to annotate the setters instead of the attributes on the classes. 我更喜欢注释设置器而不是类的属性。 For example: 例如:

public class SomeClass implements SomeInterface {

   private PetRepository petRepository;
   private VetRepository vetRepository;
   private OwnerRepository ownerRepository;
   private VisitRepository visitRepository;

   ... some methods ...

   @Resource
   public void setPetRepository(PetRepository petRepository) {
        this.petRepository= petRepository;
   }

   @Resource
   public void setVetRepository(VetRepository vetRepository) {
        this.petRepository= vetRepository;
   }

   @Resource
   public void setOwnerRepository(OwnerRepository ownerRepository) {
        this.ownerRepository = ownerRepository;
   }

   @Resource
   public void setVisitRepository(VisitRepository visitRepository) {
        this.visitRepository= visitRepository;
   }

}

Then you can create a test case like this with Mockito and Junit: 然后,您可以使用Mockito和Junit创建这样的测试用例:

public class SomeClassTestCase {

  @Mock 
  private PetRepository petRepository;

  @Mock 
  private VetRepository vetRepository;

  @Mock 
  private OwnerRepository ownerRepository;

  @Mock 
  private VisitRepository visitRepository;

  private SomeClass someClass;

  @Before
  public void before(){
     MockitoAnnotations.initMocks(this);
     someClass = new SomeClass();
     someClass.setPetRepository(petRepository);
     someClass.setVetRepository(vetRepository);
     someClass.setOwnerRepository(ownerRepository);
     someClass.setVisitRepository(visitRepository);
  }

  @Test
  public void someTest() {
    ...
  }

}

Hope it helps. 希望能帮助到你。

You can use Mockito's @InjectMocks annotation. 您可以使用Mockito的@InjectMocks批注。 This will instantiate and then inject the Mock dependencies, for example: 这将实例化然后注入Mock依赖项,例如:

@RunWith(MockitoJUnitRunner.class)
public ServiceTest {

    @Mock
    PetRepository petRepository
    // ...omitted mocks ...

    @InjectMocks
    ClinicServiceImpl service;

}

See the documentation for further usage examples and caveats. 有关更多用法示例和注意事项,请参阅文档

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM