1. Maven:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.2-groovy-2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.8.21</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>2.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-core</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
2. 对私有方法进行单元测试
private boolean validatorPwd(String password, boolean notEmpty) {
if (notEmpty && StringUtils.isEmpty(password)) {
return false;
}else if(!StringUtils.isEmpty(password)){
String check = "^.{7,}$|^$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(password);
return matcher.matches();
}
return true;
}
import com.google.common.collect.Lists
import com.primerobotics.primemanagementconsole.response.ResponseStatusEnum
import com.primerobotics.primemanagementconsole.user.dao.RoleUsersMapper
import com.primerobotics.primemanagementconsole.user.dao.UserMapper
import com.primerobotics.primemanagementconsole.user.model.RespUser
import com.primerobotics.primemanagementconsole.user.model.User
import com.primerobotics.primemanagementconsole.user.model.UserEnable
import com.primerobotics.primemanagementconsole.user.service.RoleService
import org.junit.runner.RunWith
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.powermock.reflect.Whitebox
import org.spockframework.runtime.Sputnik
import spock.lang.Specification
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([UserServiceImpl.class])
class UserServiceImplTest extends Specification {
def service = new UserServiceImpl(
userMapper: Mock(UserMapper.class),
roleUsersMapper: Mock(RoleUsersMapper.class),
roleService: Mock(RoleService.class)
)
def "ValidatorPwd return is true"() {
expect:
Whitebox.invokeMethod(service, "validatorPwd", "", false) == true
}
}
3. 对当前类的静态方法进行单元测试
- Service code
public class EncryptedData {
private EncryptedData() { throw new IllegalStateException("EncryptedData class");}
private static final char SALT_SEPARATOR = '.';
public static String encryptedData(String secret, String value) {
if (value == null || value.isEmpty()) {
return "";
}
String salt = KeyGenerators.string().generateKey();
TextEncryptor encryptor = Encryptors.text(secret, salt);
return salt + SALT_SEPARATOR + encryptor.encrypt(value);
}
}
- Test case:
def "EncryptedData"() {
given:
String defaultSecret = "qkV58KUTeLokhG0T1ThN8xY29ByZ9cb1BdOb2bpCmgSGj56hapIh2zobf2v/klSaMTh4iparORVhNtsqBRKVgw==";
String pwd = "McP-2019"
expect:
EncryptedData.encryptedData(defaultSecret,pwd) != null
}
4.对引用类的静态方法进行单元测试:
- Service code:
@Override
public BaseResponse getMailConfig() {
BaseResponse response = new BaseResponse();
List<String> codes = new ArrayList<>(2);
MailConfig mailConfig = new MailConfig();
List<SystemConfig> configList = systemConfigService.queryAllConfigByGroup(ConfigGroupEnum.SMTP.getkey());
if (configList == null || configList.isEmpty()) {
codes.add(ExceptionCodeConstants.SC_SMTP_1007.getValue());
} else {
try {
mailConfig.setActive(Boolean.valueOf(systemConfigService.getInstance(configList,
SMTPMailConfigKeyEnum.MAIL_ACTIVE.getKey()).getConfigValue()));
mailConfig.setSender(systemConfigService.getInstance(configList,
SMTPMailConfigKeyEnum.MAIL_SENDER.getKey()).getConfigValue());
mailConfig.setHostname(systemConfigService.getInstance(configList,
SMTPMailConfigKeyEnum.HOSTNAME.getKey()).getConfigValue());
mailConfig.setPort(Integer.parseInt(systemConfigService.getInstance(configList,
SMTPMailConfigKeyEnum.PORT.getKey()).getConfigValue()));
mailConfig.setUsername(systemConfigService.getInstance(configList,
SMTPMailConfigKeyEnum.USERNAME.getKey()).getConfigValue());
mailConfig.setPassword(EncryptedData.extractFrom(pmcAppProperties.getSecret(), systemConfigService.getInstance(configList,
SMTPMailConfigKeyEnum.PASSWORD.getKey()).getConfigValue()));
response.setData(mailConfig);
} catch (NullPointerException e) {
log.error(e.getMessage());
codes.add(ExceptionCodeConstants.SC_SMTP_1007.getValue());
} catch (IllegalArgumentException e) {
log.error(e.getMessage());
codes.add(ExceptionCodeConstants.SC_SMTP_1008.getValue());
} catch (NoSuchElementException e) {
log.error(e.getMessage());
codes.add(ExceptionCodeConstants.SC_SMTP_1007.getValue());
}
}
response.setCodes(codes);
BaseResponse.setReqStatus(response);
return response;
}
- Test case:
package com.primerobotics.primemanagementconsole.systemconfig.service.impl
import com.primerobotics.primemanagementconsole.PmcAppProperties
import com.primerobotics.primemanagementconsole.app.service.MailService
import com.primerobotics.primemanagementconsole.response.ResponseStatusEnum
import com.primerobotics.primemanagementconsole.startrun.ConfigCacheDataMap
import com.primerobotics.primemanagementconsole.systemconfig.enums.ConfigGroupEnum
import com.primerobotics.primemanagementconsole.systemconfig.enums.SMTPMailConfigKeyEnum
import com.primerobotics.primemanagementconsole.systemconfig.model.MailConfig
import com.primerobotics.primemanagementconsole.systemconfig.model.SystemConfig
import com.primerobotics.primemanagementconsole.systemconfig.service.SystemConfigService
import com.primerobotics.primemanagementconsole.utils.EncryptedData
import org.assertj.core.util.Lists
import org.junit.runner.RunWith
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.powermock.modules.junit4.PowerMockRunnerDelegate
import org.spockframework.runtime.Sputnik
import spock.lang.Specification
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(Sputnik.class)
@PrepareForTest([MailConfigServiceImpl.class,EncryptedData.class])
class MailConfigServiceImplTest extends Specification {
def service = new MailConfigServiceImpl(
systemConfigService:Mock(SystemConfigService.class),
pmcAppProperties: Mock(PmcAppProperties.class),
mailService: Mock(MailService.class),
configCacheDataMap: Mock(ConfigCacheDataMap.class)
)
def DEFAULT_SECRET = "qkV58KUTeLokhG0T1ThN8xY29ByZ9cb1BdOb2bpCmgSGj56hapIh2zobf2v/klSaMTh4iparORVhNtsqBRKVgw==";
def "UpdateMailConfig is success"() {
given:
MailConfig mailConfig = new MailConfig(
"active": false,
"sender": "reports@bleum.com",
"hostname": "secure.emailsrvr.com",
"port": 587,
"username": "reports@bleum.com",
"password": "McP-2019"
)
String name = "develop"
service.pmcAppProperties.getSecret() >> DEFAULT_SECRET
PowerMockito.mockStatic(EncryptedData.class)
PowerMockito.when(EncryptedData.encryptedData(DEFAULT_SECRET,mailConfig.getPassword())).thenReturn("test")
when:
def result = service.updateMailConfig(mailConfig,name)
then:
result.getStatus() == ResponseStatusEnum.SUCCESS.toString()
}
def "UpdateMailConfig is fail"() {
given:
MailConfig mailConfig = new MailConfig(
"active": false,
"sender": "reports@bleum.com",
"hostname": "",
"port": 587,
"username": "reports@bleum.com",
"password": "McP-2019"
)
String name = "develop"
when:
def result = service.updateMailConfig(mailConfig,name)
then:
result.getStatus() == ResponseStatusEnum.FAIL.toString()
}
def "UpdateMailConfig send email fail "() {
given:
MailConfig mailConfig = new MailConfig(
"active": true,
"sender": "reports@bleum.com",
"hostname": "secure.emailsrvr.com",
"port": 587,
"username": "reports@bleum.com",
"password": "McP-2019"
)
String name = "develop"
service.pmcAppProperties.getSecret() >> DEFAULT_SECRET
PowerMockito.mockStatic(EncryptedData.class)
PowerMockito.when(EncryptedData.encryptedData(DEFAULT_SECRET,mailConfig.getPassword())).thenReturn("test")
when:
def result = service.updateMailConfig(mailConfig,name)
then:
result.getStatus() == ResponseStatusEnum.FAIL.toString()
}
def active = new SystemConfig(configKey: SMTPMailConfigKeyEnum.MAIL_ACTIVE.getKey(),configValue: "true")
def sender = new SystemConfig(configKey: SMTPMailConfigKeyEnum.MAIL_SENDER.getKey(),configValue: "reports@bleum.com")
def hostName = new SystemConfig(configKey: SMTPMailConfigKeyEnum.HOSTNAME.getKey(),configValue: "secure.emailsrvr.com")
def port = new SystemConfig(configKey: SMTPMailConfigKeyEnum.PORT.getKey(),configValue: "587")
def userName = new SystemConfig(configKey: SMTPMailConfigKeyEnum.USERNAME.getKey(),configValue: "reports@bleum.com")
def password = new SystemConfig(configKey: SMTPMailConfigKeyEnum.PASSWORD.getKey(),configValue: "test")
def systemConfigList = Lists.newArrayList(active,sender,hostName,port,userName,password)
def "GetMailConfig"() {
given:
service.systemConfigService.queryAllConfigByGroup(ConfigGroupEnum.SMTP.getkey()) >> systemConfigList
service.pmcAppProperties.getSecret() >> DEFAULT_SECRET
PowerMockito.mockStatic(EncryptedData.class)
PowerMockito.when(EncryptedData.extractFrom(DEFAULT_SECRET, "test")).thenReturn("test")
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.MAIL_ACTIVE.getKey()) >> active
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.MAIL_SENDER.getKey()) >> sender
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.HOSTNAME.getKey()) >> hostName
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.PORT.getKey()) >> port
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.USERNAME.getKey()) >> userName
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.PASSWORD.getKey()) >> password
expect:
service.getMailConfig().getStatus() == ResponseStatusEnum.SUCCESS.toString()
}
def "GetMailConfig in NullPointException 01"() {
expect:
service.getMailConfig().getStatus() == ResponseStatusEnum.FAIL.toString()
}
def "GetMailConfig in NullPointException 02"() {
given:
service.systemConfigService.queryAllConfigByGroup(ConfigGroupEnum.SMTP.getkey()) >> systemConfigList
expect:
service.getMailConfig().getStatus() == ResponseStatusEnum.FAIL.toString()
}
def "GetMailConfig in IllegalArgumentException "() {
given:
service.systemConfigService.queryAllConfigByGroup(ConfigGroupEnum.SMTP.getkey()) >> systemConfigList
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.MAIL_ACTIVE.getKey()) >> active
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.MAIL_SENDER.getKey()) >> sender
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.HOSTNAME.getKey()) >> hostName
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.PORT.getKey()) >> port
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.USERNAME.getKey()) >> userName
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.PASSWORD.getKey()) >> password
service.pmcAppProperties.getSecret() >> DEFAULT_SECRET
PowerMockito.mockStatic(EncryptedData.class)
PowerMockito.when(EncryptedData.extractFrom(DEFAULT_SECRET, "test")).thenThrow(IllegalArgumentException.class)
expect:
service.getMailConfig().getStatus() == ResponseStatusEnum.FAIL.toString()
}
def "GetMailConfig in NoSuchElementException "() {
given:
service.systemConfigService.queryAllConfigByGroup(ConfigGroupEnum.SMTP.getkey()) >> systemConfigList
service.systemConfigService.getInstance(systemConfigList,SMTPMailConfigKeyEnum.MAIL_ACTIVE.getKey()) >> { throw new NoSuchElementException()}
service.pmcAppProperties.getSecret() >> DEFAULT_SECRET
PowerMockito.mockStatic(EncryptedData.class)
PowerMockito.when(EncryptedData.extractFrom(DEFAULT_SECRET, "test")).thenReturn("test")
expect:
service.getMailConfig().getStatus() == ResponseStatusEnum.FAIL.toString()
}
}