spring boot 单元测试是确保代码质量的重要部分,它允许我们在不实际启动整个应用的情况下测试我们的代码。在spring boot中,我们通常使用spring test模块和junit测试框架来编写单元测试。以下是一个简单的spring boot单元测试的详细代码介绍:
首先,假设我们有一个简单的userservice
,它有一个finduserbyid
方法:
@service
public class userservice {
@autowired
private userrepository userrepository;
public user finduserbyid(long id) {
return userrepository.findbyid(id).orelse(null);
}
}
接下来,我们将为userservice
编写单元测试:
import org.junit.jupiter.api.beforeeach;
import org.junit.jupiter.api.test;
import org.junit.jupiter.api.extension.extendwith;
import org.mockito.injectmocks;
import org.mockito.mock;
import org.mockito.junit.jupiter.mockitoextension;
import org.springframework.boot.test.context.springboottest;
import java.util.optional;
import static org.mockito.mockito.*;
import static org.junit.jupiter.api.assertions.*;
@extendwith(mockitoextension.class)
@springboottest
public class userservicetest {
@mock
private userrepository userrepository;
@injectmocks
private userservice userservice;
private user user;
@beforeeach
void setup() {
user = new user();
user.setid(1l);
user.setname("test user");
}
@test
void finduserbyid_userexists_returnsuser() {
// arrange
when(userrepository.findbyid(1l)).thenreturn(optional.of(user));
// act
user founduser = userservice.finduserbyid(1l);
// assert
assertnotnull(founduser);
assertequals(user.getid(), founduser.getid());
assertequals(user.getname(), founduser.getname());
verify(userrepository).findbyid(1l);
}
@test
void finduserbyid_userdoesnotexist_returnsnull() {
// arrange
when(userrepository.findbyid(2l)).thenreturn(optional.empty());
// act
user founduser = userservice.finduserbyid(2l);
// assert
assertnull(founduser);
verify(userrepository).findbyid(2l);
}
}
在上面的代码中,我们使用了mockito库来模拟userrepository
的行为。@mock
注解用于创建userrepository
的模拟对象,而@injectmocks
注解则用于创建userservice
的实例,并将模拟的userrepository
注入到其中。
在setup
方法中,我们创建了一个user
对象,用于后续的测试。
我们编写了两个测试用例:finduserbyid_userexists_returnsuser
和finduserbyid_userdoesnotexist_returnsnull
。在每个测试用例中,我们首先使用when
方法来定义模拟的userrepository
的行为。然后,我们调用userservice.finduserbyid
方法来执行实际的测试。最后,我们使用断言来验证测试的结果是否符合预期。
注意,我们使用verify
方法来验证userrepository
的findbyid
方法是否被调用。这是一个好的实践,因为它可以确保我们的代码确实与模拟的对象进行了交互。
总的来说,spring boot的单元测试可以帮助我们确保代码的正确性,并在代码更改时提供及时的反馈。通过编写详细的测试用例,我们可以确保应用的各个部分都能正常工作,从而提高应用的质量和可靠性。
发表评论