Spock 集成PowerMock 进行单元测试

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. 对私有方法进行单元测试

  • Service code:
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;
    }
  • Test case:

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. 对当前类的静态方法进行单元测试

  1. 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);
    }
}
  1. Test case:
def "EncryptedData"() {
        given:
        String defaultSecret = "qkV58KUTeLokhG0T1ThN8xY29ByZ9cb1BdOb2bpCmgSGj56hapIh2zobf2v/klSaMTh4iparORVhNtsqBRKVgw==";
        String pwd = "McP-2019"
        expect:
        EncryptedData.encryptedData(defaultSecret,pwd) != null
    }

4.对引用类的静态方法进行单元测试:

  1. 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;
    }
  1. 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
/**
 * @author Bear* @date 1/4/2020 3:27 PM
 *
 */
@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()
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值