Spring boot 如何测试会话方法?

Spring boot 如何测试会话方法?,spring-boot,unit-testing,Spring Boot,Unit Testing,我试图@测试一个服务类,但是有几个get()方法我不知道如何测试。我需要知道如何收集必要的数据,或者至少知道如何测试TokenHelper类的其余方法 这是课程课程: public class SessionData { public static final String KEY = "session_data"; private Integer id; private String email; private String fullN

我试图
@测试
一个
服务
类,但是有几个
get()
方法我不知道如何测试。我需要知道如何收集必要的数据,或者至少知道如何测试TokenHelper类的其余方法

这是
课程
课程:

public class SessionData {

    public static final String KEY = "session_data";

    private Integer id;
    private String email;
    private String fullName;
    private List<Role> role;
    private Boolean tempSession;
    private int permissionsMask = 0;
    private String avatar;

    public boolean hasAnyRole(Role... roles) {
        for (Role r : roles) {
              if (this.role.contains(r)) {  
                return true;
              }
        }
        return false;
    }
}
这是我的
@测试

    @Test
        void googleTokenHelperTest() throws InvalidTokenException {
            TokenHelper obj1 = BeanBuilder.builder(TokenHelper.class).createRandomBean();
        String mailGoogle = "google@prueba.com";
        String firstGoogle = "Nombre";
        String lastGoogle = "Apellido";
        Map<String, Object> pruebaGoogle = new HashMap<String, Object>();
        List<String> info = new ArrayList<String>();
        info.add(firstGoogle);
        info.add(lastGoogle);
        pruebaGoogle.put(mailGoogle, info);       

        UserGoogle expectedUser = UserGoogle.builder().email(mailGoogle).firstName(firstGoogle).lastName(lastGoogle).build();
        String myTestToken = pruebaGoogle.toString();
        UserGoogle actualUser = obj1.getTokenDataFromGoogleToken(myTestToken);
        assertEquals(actualUser, expectedUser);
        }
@测试
void googleTokenHelperTest()引发InvalidTokenException{
TokenHelper obj1=BeanBuilder.builder(TokenHelper.class).createRandomBean();
字符串mailGoogle=”google@prueba.com";
String firstGoogle=“Nombre”;
字符串lastGoogle=“Apellido”;
Map pruebaGoogle=newhashmap();
列表信息=新的ArrayList();
info.add(firstGoogle);
info.add(lastGoogle);
pruebaGoogle.put(mailgool,info);
UserGoogle expectedUser=UserGoogle.builder().email(mailgool).firstName(firstGoogle).lastName(lastgool.build();
字符串myTestToken=pruebaGoogle.toString();
UserGoogle actualUser=obj1.getTokenDataFarmGoogleToken(myTestToken);
资产质量(实际值、预期值);
}
我已经创建了一些变量来组成一个用户,但是我需要用一个映射来构建它们,以便在generate()方法的帮助下生成令牌。我需要知道如何连接这三个变量并将它们传递给generate()方法,然后将结果变量传递给google方法以生成新用户。

测试通常遵循给定的when-then结构。给定某个前提条件,当执行某个操作时,将返回某个结果/观察某个行为。当非常正式地实现时,这被称为BDD(行为驱动开发),但即使不实践BDD,测试通常仍遵循该模式

在这种情况下,我建议测试如下:

给定某些数据存在于服务线程数据中 当我打电话给你 然后我得到期望值

在上面的场景中,给定的部分可能包括在服务上设置一些数据,when调用
get
,then断言这是期望值

我鼓励你考虑各种情况。例如,如果数据不存在会发生什么?如果不是消费者要求的类别,会发生什么?地图区分大小写吗?等等

初始实例的代码示例(我不确定这里有什么BeanBuilder,所以我省略了它):

编辑以添加看到有人参与单元测试总是很棒的,所以如果您有任何后续行动,请询问我很乐意提供帮助。从经过良好测试的代码中获得的信心对于软件开发人员来说是一件好事。

测试通常遵循给定的when-then结构。给定某个前提条件,当执行某个操作时,将返回某个结果/观察某个行为。当非常正式地实现时,这被称为BDD(行为驱动开发),但即使不实践BDD,测试通常仍遵循该模式

在这种情况下,我建议测试如下:

给定某些数据存在于服务线程数据中 当我打电话给你 然后我得到期望值

在上面的场景中,给定的部分可能包括在服务上设置一些数据,when调用
get
,then断言这是期望值

我鼓励你考虑各种情况。例如,如果数据不存在会发生什么?如果不是消费者要求的类别,会发生什么?地图区分大小写吗?等等

初始实例的代码示例(我不确定这里有什么BeanBuilder,所以我省略了它):


编辑以添加看到有人参与单元测试总是很棒的,所以如果您有任何后续行动,请询问我很乐意提供帮助。从经过良好测试的代码中获得的自信对于软件开发人员来说是一件好事。

编辑:OP澄清后,问题的主题改变了


您的问题源于有缺陷的面向对象设计。例如,
SessionData
通过在与会话相关的字段中包含与用户相关的字符串字段,隐式地持有用户。这种重叠使得测试代码变得困难,因为为了测试某些用户数据的令牌生成,您需要一个会话对象,它引入了额外的数据和依赖项

这是您很难从三个输入值中获取令牌的一个主要原因


您想测试
getTokenDataFarmGoogleToken(字符串标记)
您需要知道的第一件事是,有效的令牌字符串是什么样子的。

接下来,您需要通过以下两种方式之一模拟您的
声明
对象:

  • Mockito.mock
    当调用
    claims.get()
    时,使用
    Mockito
    返回必要的字符串
  • Mockito.mock
    您的
    Jwts.parser().parseClaimsJwt(不带签名).getBody()
    返回满足测试目的的
    声明
    对象
  • 由于令牌的签名与测试方法无关,因此只需关注
    -分隔符之前的子字符串,即令牌字符串中
    之后的部分可以是您喜欢的任何字符串

    如果要测试
    生成(SessionData,long)
    则需要提供一个
    SessionData
    对象和一个long值。然后,根据需要对字符串进行
    assertEquals
    。但是,当前您的代码并不意味着您的
    get
    与您的
    generate
    有任何关联。这是因为您只处理字符串。一个更好的设计应该是有一个
    用户
    会话
    令牌
    -类,这些类也可以
        @Test
            void googleTokenHelperTest() throws InvalidTokenException {
                TokenHelper obj1 = BeanBuilder.builder(TokenHelper.class).createRandomBean();
            String mailGoogle = "google@prueba.com";
            String firstGoogle = "Nombre";
            String lastGoogle = "Apellido";
            Map<String, Object> pruebaGoogle = new HashMap<String, Object>();
            List<String> info = new ArrayList<String>();
            info.add(firstGoogle);
            info.add(lastGoogle);
            pruebaGoogle.put(mailGoogle, info);       
    
            UserGoogle expectedUser = UserGoogle.builder().email(mailGoogle).firstName(firstGoogle).lastName(lastGoogle).build();
            String myTestToken = pruebaGoogle.toString();
            UserGoogle actualUser = obj1.getTokenDataFromGoogleToken(myTestToken);
            assertEquals(actualUser, expectedUser);
            }
    
    @Test
    public void testCurrentThreadServiceReturnsExpectedValue() {
        final String key = "TEST KEY";
        final String value = "TEST VALUE";
    
        //Initialize System Under Test
        CurrentThreadService sut = new CurrentThreadService();
    
        //Given - precondition
        sut.set(key, value);
    
        //When - retrieve value
        String observedValue = sut.get(key, String.class);
    
        //Then - value is as expected
        assertEquals(value, observedValue);
    }
    
    @Test
    void givenGoogleToken_whenTokenHelperGeneratesUserFromToken_UserOk() {
    
        TokenHelper helper = new TokenHelper();
        String myTestToken = ...; //
    
        UserGoogle expectedUser = ... // generate the UserGoogle Object you expect to obtain from your TokenHelper class
        UserGoogle actualUser = helper.getTokenDataFromGoogleToken(myTestToken);
        assertEquals(actualUser, expectedUser);
    }