Spring boot 如何模拟1个依赖项并自动连接另一个依赖项?

Spring boot 如何模拟1个依赖项并自动连接另一个依赖项?,spring-boot,dependency-injection,mocking,mockito,autowired,Spring Boot,Dependency Injection,Mocking,Mockito,Autowired,我的控制器中有两个依赖项:验证器和存储库。对于这个特定的测试,我想模拟验证器,但保留存储库(现在)。在以前的代码版本中,我的控制器只有一个依赖项(存储库),这样的测试设置似乎可以自动连接到正确的存储库中 @Autowired CreateShortUrlController createShortUrlController; 当我引入验证器依赖项时,我将测试设置更改为 @Autowired UrlRepository repository; @Mock UrlValidator urlVal

我的控制器中有两个依赖项:验证器和存储库。对于这个特定的测试,我想模拟验证器,但保留存储库(现在)。在以前的代码版本中,我的控制器只有一个依赖项(存储库),这样的测试设置似乎可以自动连接到正确的存储库中

@Autowired
CreateShortUrlController createShortUrlController;
当我引入验证器依赖项时,我将测试设置更改为

@Autowired
UrlRepository repository;

@Mock
UrlValidator urlValidator = new UrlValidator();

CreateShortUrlController createShortUrlController = new CreateShortUrlController(repository, urlValidator);

现在,当我运行测试时,它说我的存储库为空。我能做些什么来保持在模仿其他依赖项的同时抓取正确存储库的“魔力”吗?

您应该将
@InjectMock
CreateShortUrlController
一起使用,并将
@Spy
UrlRepository
@Mock
UrlValidator一起使用

@InjectMocks
CreateShortUrlController createShortUrlController;

@Spy
UrlRepository repository;

@Mock
UrlValidator urlValidator;

@Before
public void init() {
    MockitoAnnotations.initMocks(this);
    this.repository = new UrlRepository();
    this.createShortUrlController = new CreateShortUrlController(repository, urlValidator);
}

但您可能需要考虑应用程序的dessin,并确保如果需要在此处或在基础结构层测试UrlRepository,您需要熟悉@MockBean,并使用它(而不是@Mock)使spring上下文知道您的模拟bean

@Autowired
CreateShortUrlController createShortUrlController;

@MockBean
UrlValidator urlValidator;

我必须在这里实例化URLRepository吗?它以前是自动创建的。UrlRepository也是一个接口-我没有具体的实现,但它可以工作。我想我只是想避免显式创建它,因为它以前似乎是在幕后创建的。这是什么样的测试@SpringBootTest?是-@SpringBootTest(webEnvironment=SpringBootTest.webEnvironment.RANDOM_PORT)可以工作!我注意到我的测试套件速度慢了很多。SpringBootTest它比WebMvcTest(比普通junit测试重)要重得多。不过,我不希望时间损失超过一秒(除非你有很多启动时间任务)