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



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

@Autowired
CreateShortUrlController createShortUrlController;

当我引入验证器依赖项时,我将测试设置更改为以下内容

@Autowired
UrlRepository repository;
@Mock
UrlValidator urlValidator = new UrlValidator();
CreateShortUrlController createShortUrlController = new CreateShortUrlController(repository, urlValidator);

现在,当我运行测试时,它说我的存储库为空。我能做些什么来保留在嘲笑另一个依赖项的同时抓住正确存储库的"魔力"?

你需要熟悉@MockBean,并使用它(而不是@Mock(来使春天的上下文知道你的模拟豆子。

@Autowired
CreateShortUrlController createShortUrlController;
@MockBean
UrlValidator 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);
}

但是您可能需要考虑应用程序的设计,并确保是否需要在此处或基础架构层测试UrlRepository

最新更新