Java 如何使用Junit4进行单元测试?
我已经创建了一个JWTCreateImpl类,下面给出了该类以使用GenerateToken方法生成jwt令牌,并使用loginUser方法响应jwt字符串。loginUser方法将电子邮件和密码作为来自前端的参数。此电子邮件与数据库中存在的电子邮件进行比较,如果不存在电子邮件,则错误响应将变为电子邮件不存在,因为密码不匹配。最后,如果存在特定id的电子邮件和密码,则从数据库提取结果并仅传递用户的uuid以生成令牌,响应将是jwt字符串。我想使用Junit4为这个类执行单元测试,如何使用Junit4为这个类编写测试用例 JWTCreateImpl类实现JWTCreate接口,该接口包含抽象方法loginUserUserInfoJWT和generateTokenUUID uuid,以及generateToken方法中使用的一个字符串JWT_TOKEN_键,该键主要用于HMAC256算法。UserInfoJWT是一个POJO类,包含用户的电子邮件和密码 ResponseJWT是一个包含UserToken和errorResponse的POJO类Java 如何使用Junit4进行单元测试?,java,jwt,junit4,Java,Jwt,Junit4,我已经创建了一个JWTCreateImpl类,下面给出了该类以使用GenerateToken方法生成jwt令牌,并使用loginUser方法响应jwt字符串。loginUser方法将电子邮件和密码作为来自前端的参数。此电子邮件与数据库中存在的电子邮件进行比较,如果不存在电子邮件,则错误响应将变为电子邮件不存在,因为密码不匹配。最后,如果存在特定id的电子邮件和密码,则从数据库提取结果并仅传递用户的uuid以生成令牌,响应将是jwt字符串。我想使用Junit4为这个类执行单元测试,如何使用Juni
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.knoldus.magad.jwt.api.JWTCreate;
import com.knoldus.magad.jwt.model.ResponseJWT;
import com.knoldus.magad.jwt.model.UserInfoJWT;
import com.knoldus.magad.dao.model.UserInfo;
import com.knoldus.magad.user.api.UserInfoProcessingAPI;
import org.apache.log4j.Logger;
import java.io.UnsupportedEncodingException;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class JWTCreateImpl implements JWTCreate {
private static final Logger LOGGER = Logger.getLogger(JWTCreateImpl.class);
private UserInfo existingUser;
private ResponseJWT response;
private UserInfoProcessingAPI userInfoProcessingAPI;
private static final String NO_USER_EMAIL = "Email doesn't exists..";
private static final String LOGIN_UNSUCCESSFUL = "Wrong Password";
@Override
public CompletableFuture<String>loginUser(final UserInfoJWT userInfoJWT) {
return userInfoProcessingAPI.getUserInfo(userInfoJWT.getUserEmail()).thenApply(result -> {
existingUser = result.orElse(null);
if (existingUser == null) {
response = ResponseJWT.builder().errorResponse(NO_USER_EMAIL).build();
} else {
final String dataBasePassword = existingUser.getUserPassword();
if (userInfoJWT.getUserPassword().equals(dataBasePassword)) {
response = ResponseJWT.builder().userToken(generateToken(existingUser.getUuid())).build();
} else {
response = ResponseJWT.builder().errorResponse(LOGIN_UNSUCCESSFUL).build();
}
}
return response.toString();
});
}
@Override
public String generateToken(final UUID uuid) {
try {
final Algorithm algorithm = Algorithm.HMAC256(JWT_TOKEN_KEY);
final Date expirationDate = Date.from(ZonedDateTime.now().plusHours(24).toInstant());
final Date issuedAt = Date.from(ZonedDateTime.now().toInstant());
final String id = String.valueOf(uuid);
final String issuer = "MagADAuth";
return JWT.create()
.withIssuedAt(issuedAt) // Issue date.
.withExpiresAt(expirationDate) // Expiration date.
.withClaim("userId", id)
.withIssuer(issuer) // Issuer of the token.
.sign(algorithm); // And the signing algorithm.
} catch (UnsupportedEncodingException | JWTCreationException e) {
LOGGER.error(e.getMessage(), e);
}
return null;
}
我们都知道,单元测试是独立测试应用程序的一小部分,这意味着在我们的例子中,方法应该独立测试 在您的例子中,JWTCreateImpl类的loginUser方法实际上依赖于对象UserInfoJWT、UserInfoProcessingAPI,以便对loginUser方法进行单元测试 我们需要模拟UserInfoJWT类,以便它将向我们返回电子邮件,这实际上是该方法所需的输入 我们还需要模拟UserInfoProcessingAPI,以便它返回用户 最后,我们还需要在我们的单元测试用例中调用实方法loginUser方法。我们还需要使用单独的单元测试测试loginUser方法在每个可能的条件下 对于generateToken方法,我们还需要提供UUID模拟到单元测试。 对于上述情况,我更喜欢Mockito和Junit 参考链接 按注释编辑
我不知道Junit和Mockinghow是如何模拟类和方法的,所以请您用代码解释一下。@kundangupta根据您的案例编辑了我的答案,应该可以开始了
@RunWith(MockitoJUnitRunner.class)
public class JWTCreateImplTest {
/* class under test should not be mocked */
private JWTCreateImpl jwtCreateImpl;
/* Mocking UserInfoProcessingAPI as it is dependency of JWTCreateImpl */
@Mock
private UserInfoProcessingAPI infoProcessingAPI;
/*Mockito method which setup everything before test actually start (All Object Initialization can be done here */
@Before
public void setup() {
jwtCreateImpl = new JWTCreateImpl();
}
/* Testing Happy flow */
@Test
public void testNotNullJwtToken() {
Mockito.when(infoProcessingAPI.getUserInfo(getUser().getUserEmail())).thenReturn(getAppUser());
CompletableFuture<String> jwtToken = jwtCreateImpl.loginUser(getUser());
Assert.assertNotNull(jwtToken);
}
/* Testing when null email is passed */
@Test
public void testJwtTokenWithNullEmail() {
/* this will return null as there are no object exists with email <null> */
Mockito.when(infoProcessingAPI.getUserInfo(null)).thenReturn(null);
CompletableFuture<String> jwtToken = jwtCreateImpl.loginUser(getUser());
/* response of NO_USER_EMAIL should be checked here */
Assert.assertEquals("NO_USER_EMAIL",jwtToken);
}
/*TODO */
/* similarly you need to check
* when password is null <AND>
* when password doesn't match with requester password <AND>
* generateToken method should be checked for positive scenrio as well as case scenrio where it will throw
* UnsupportedEncodingException or JWTCreationException
* all of these in independant test cases
*/
private UserInfoJwt getUser(){
UserInfoJwt userInfoJwt = new UserInfoJwt();
userInfoJwt.setUserEmail("name@java.com");
userInfoJwt.setUserEmail("myPassword");
return userInfoJwt;
}
private AppUser getAppUser() {
AppUser user = new AppUser();
user.setId(1);
user.setName("name");
user.setEmail("appuser@java.com");
return user;
}
}