gpt4 book ai didi

java - 使用mockito测试Spring中的Controller方法

转载 作者:行者123 更新时间:2023-12-01 19:54:58 27 4
gpt4 key购买 nike

@PostMapping(path = "/add")
public @ResponseBody ResponseEntity<String> addAccount(@RequestBody Account account) {
if (account != null && account.getUserName() != null && account.getUserPass() != null) ) {
if (accountRepository.countUserName(account.getUserName()) > 0) {
return new ResponseEntity<String>("Account",HttpStatus.BAD_REQUEST);
}
account.setUserPass(bCryptPasswordEncoder.encod(account.getUserPass()));
accountRepository.AccountSaveTo(account);
return new ResponseEntity<String>("Saved",HttpStatus.OK);
}
return new ResponseEntity<String>("Invalid",HttpStatus.BAD_REQUEST);
}

我必须测试 AccountController 的这个方法。我正在使用 Mockito 库在 Spring 中测试该方法。我如何测试这个方法?我之前编写了以下单元测试:

@Test
public void shouldSaveAccountToDb() {
Account acc = new Account();
acc.setUser(this.user);
acc.setEmail(this.mail);
String account = this.accountController.addAccount(this.user, this.mail);
verify(this.accountRepepetytory)).save(Mockito.refEq(acc, new String[0]));
Assert.assertThat(account, CoreMatchers.is("Account"));
}

但是这个方法被改进和改变了,我必须编写一个新的单元测试,但我不知道如何以及从哪里开始。你能帮忙吗,即使是伪代码?

最佳答案

一旦我们谈论 Mockito,我们必须记住我们只是在尝试单元测试,对吗?我的意思是,没有相关的集成等等。

我对你的测试感到有点困惑,因为你发布了一些类(我想它是你的 Controller ),但你期望从你的 AccountRepository 调用一些方法,但即使你调用你正在观察参数的引用您正在发送,而不是值本身。

就我个人而言,探索我从您的测试中理解的内容,我会这样做:

@RunWith(MockitoJUnitRunner.class)
public class AccountControllerTest {
@Spy
@InjectMocks
private AccountController controller;

@Mock
private AccountRepository repository;

@Test
public void shouldSaveAccountToDb() {
Account acc = new Account();
acc.setUser(this.user);
acc.setEmail(this.mail);

doReturn(0).when(repository).countUserName(this.user);
doReturn("Saved").when(repository).accountSaveTo(acc);

ResponseEntity<String> result = controller.addAccount(acc);

verify(repository, times(1)).accountSaveTo(acc);
Assert.assertEquals("Saved", result.getEntity());

}

解释我做了什么:

根据您的测试名称,我想您只希望将正确的结果保存在数据库中。 “帐户”不是在保存在数据库上时返回的,而是当该帐户已存在时返回的,因此您的测试命名并未反射(reflect)它实际上的作用。

考虑到这一点,我确定了对此测试的期望,以正确反射(reflect)它正在做什么。

之后,我为您的 Controller 使用了@Spy注释(它进入了带注释的类的真实方法)和@Mock( 它不会输入外部组件的带注释的类的实际方法)。 @InjectMocks 将所有模拟添加到带注释的实例中。

一旦我们已经拥有了要隔离测试的组件(单元),我将模拟外部组件的结果,如下所示:

doReturn({expected_return}).when({mock}).{method_name}({parameters});

现在,当您的测试运行时,代码将回答您在 @Spy 组件内为该组件配置的内容,现在您只需测试该单元并访问真实的方法以在将来覆盖它。

先生,我希望对您有所帮助:)

关于java - 使用mockito测试Spring中的Controller方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49907978/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com