当前位置: 首页 > 知识库问答 >
问题:

在Spring Junit测试中使用不同的Auth模型

赏成益
2023-03-14

我使用Spring和Junit4来测试我的服务器应用程序。我的应用程序使用Spring Security性,一些查询利用SpEL语法检查记录的用户。

因为我正在测试一些需要加载数据的场景,所以我遇到了一些问题,因为我不适合这样做。

例如:

@Test
    @WithUserDetails(userDetailsServiceBeanName = "mockUserDetailService", value = "customer")
    public void saveEcommerceTicket() {
        ZonedDateTime entryDate = ZonedDateTime.now().plusDays(1);
        createStandardFare();
        createDailyCode(entryDate.toInstant());
        createPaymentWithWallet();
        Customer customer = createCustomerWithWallet(new BigDecimal(100));

        Ticket ticket = new Ticket();
        ticket.setLicensePlate1("AA123BB");
        ticket.setArea(areaCentroStorico);
        ticket.setDailyCode("CC");
        ticket.setEntryDate(entryDate.toInstant());
        ticket.setExitDate(entryDate.plusDays(1).toInstant());
        ticket.setPassengers(50);
        ticket.setPassengersCountry(italy);
        ticket.setCustomer(customer);

        ticket = ticketService.saveFromEcommerceWithWalletPayment(ticket, new ArrayList<Media>());

        assertEquals(true, ticket.isStandard());
        assertEquals(TicketStatus.VALID, ticket.getStatus());
        assertTrue(new BigDecimal(100).compareTo(ticketRepository.sumPayments(ticket.getId())) == 0);
        assertTrue(BigDecimal.ZERO.compareTo(customer.getWallet().getBalance()) == 0);
        assertEquals(true, ticket.isPaid());
    }

这是一个使用自定义UserDetailService的测试示例。不幸的是,有些操作,如:createStandardFare()、createDailyCode()等,需要不同的角色。我试图手动设置身份验证,但最终总是让整个html" target="_blank">测试由一个角色完成。相反,我需要一些部分与特定角色一起执行(比方说ADMIN),而另一些部分与另一个角色一起执行(比方说CUSTOMER)。

有什么方法可以用Spring和JUnit来实现这一点吗?

共有1个答案

孔正文
2023-03-14

如果您在单个测试方法中调用不同的方法,而这些方法需要不同的角色,那么实际上只有两个选项。

  • 配置一个模拟用户(例如,通过@WithMockUser或类似的方式),为其分配测试方法中使用的所有角色。
  • 在测试方法本身内以编程方式切换当前模拟用户。
    • 例如,使用以下代码段。
    @Test
    public void test() {
        login("customer", "password", "ROLE_CUSTOMER");
        // ...
        login("admin", "password", "ROLE_ADMIN");
        // ...
    }
    
    static void login(String username, String password, String... roles) {
        SecurityContext context = SecurityContextHolder.createEmptyContext();
    
        User user = new User(username, password, roles(roles));
    
        Authentication auth = new UsernamePasswordAuthenticationToken(user, password, user.getAuthorities());
        context.setAuthentication(auth);
        SecurityContextHolder.setContext(context);
    }
    
    static List<SimpleGrantedAuthority> roles(String... roles) {
        return Arrays.stream(roles).map(SimpleGrantedAuthority::new).collect(toList());
    }
    

    注意:user在上面的示例中是org.springframework.security.core.userdetails.user

 类似资料:
  • 我有一个在kotlin的‘基地’项目配置与gradle DSL。在基我有模块'app'和模块'library'。模块应用程序使用模块库。我想从模块应用程序的测试(准确地说是库的testUtils包)访问模块库的测试。 我还检查了代码所在的问题: 我需要在库的源代码中添加,这样在应用程序的测试中,我就可以使用库的测试包,而在应用程序的源代码中,我就不能使用库的测试了。 谢谢你。

  • 例如: 数据提供程序1:dataA 数据提供程序2:dataB,dataC 数据提供程序3:dataD、dataE、dataG 所以我的测试需要一个数据提供者。但是我希望它根据测试组为不同的测试类型选择不同的数据提供者。例如,如果我正在运行“smoke”组,那么我希望使用数据提供者1;如果我正在运行“sanity”组,那么我希望运行数据提供者1和数据提供者2;如果我正在运行“regression”

  • 我们有一个基于Spring的JUnit测试类,它利用一个内部测试上下文配置类 最近,服务类中引入了新的功能,相关测试应添加到ServiceTest中。但是,这也需要创建不同的测试上下文配置类(现有配置类的内部结构相当复杂,如果可能的话,将其更改为既服务于旧测试又服务于新测试似乎非常困难) 有没有一种方法可以实现一个测试类中的某些测试方法将使用一个配置类,而其他方法将使用另一个?似乎只适用于类级别,

  • 3. 我不想在我的API中传递所有的参数作为请求体,有些只有查询、变量、输入有些只有查询和变量,就像上面的json数据,我想创建相同的模型,可以在其余的API中使用。目前,我已经为每个API创建了不同的模型。 公共类CreatetRequest{ } 这里我在所有API中复制了我的模型,所以我想创建三个模型类,其中包含所有必需的变量,这些变量在我的引导应用程序中都是常见的,但同时我必须避免在res

  • 问题内容: 我需要测试我的Django应用程序的Photo模型。如何使用测试图像文件模拟ImageField? tests.py 问题答案: 对于将来的用户,我已经解决了这个问题。您可以使用实例来模拟。 test.py

  • 问题内容: 我正在尝试测试tensorflow程序。我正在使用参数化的py.test夹具设置tensorflow会话: Tensorflow具有全局状态,因此一些测试启动会污染它。例如,启用急切执行后,无法禁用它。有没有一种方法可以指示py.test为每个测试创建一个新进程?还是使用参数化夹具来配置测试环境的另一种方法?用法示例: 问题答案: 如评论中所建议,使用将是解决方案。该插件设计用于并行或