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

如何对OAUTH Spring Boot进行模拟测试

娄振
2023-03-14

我想用Mock for Spring Boot制作一个测试用例,但我无法连接到授权服务器:

我的控制器:

public class AuthController {

@Autowired
private AuthService authService;

@Autowired
private TokenStore tokenStore;

@PostMapping(value = Constants.LOGIN_URL,
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE)
public Auth login(@RequestBody Auth login, OAuth2Authentication auth) throws ApiException {

    Auth result = authService.auth(login);

    final OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) auth.getDetails();
    result.setAccessToken(details.getTokenValue());
    final OAuth2AccessToken accessToken = tokenStore.readAccessToken(details.getTokenValue());
    result.setTtl(accessToken.getExpiresIn());

    return result;
}

这是我的测试,但取一个错误NullPointer,可能是因为在方法中有一个参数(OAuth2Authentication auth),我不知道如何将其放入测试中:

@Before
public void setup() {
    mockMvc = MockMvcBuilders.standaloneSetup(controller)                
          .apply(documentationConfiguration(this.jUnitRestDocumentation))
          .setCustomArgumentResolvers(new AuthenticationPrincipalArgumentResolver()).build();
}

@Test
public void getLogin() throws Exception, ApiException {

   Auth authMock = Mockito.mock(Auth.class);
   Mockito.when(service.auth(Mockito.any(Auth.class))).thenReturn(authMock);

    String requestBody = "{" +
            "\"username\":" + "\"YENNIFER\"" +
            ",\"nid\":" + "\"13991676\"" +
            ",\"password\":" + "\"password\"" +
            ",\"email\":" + "\"cervecera.artesanal@gmail.com\"" +
            "}";

    mockMvc.perform(MockMvcRequestBuilders.post("/api/v1/auth/login")
            .contentType(MediaType.APPLICATION_JSON)
            .content(requestBody))
            .andExpect(status().isOk());
}

共有1个答案

夏侯昆琦
2023-03-14

您可以简单地模拟AuthService并将该模拟注入控制器,例如:

@RunWith(SpringJUnit4ClassRunner.class)
public class AuthControllerTest {

    @Mock
    private AuthService authService;

    @InjectMocks
    private AuthController controller;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testAuth() {
        Auth authMock = Mockito.mock(Auth.class);
        Mockito.when(authService.auth(Mockito.any(Auth.class)).thenReturn(auth));
    }
} 
 类似资料:
  • 我有一个示例方法(我需要编写测试用例)如下所示, 我想模拟getConfig方法并返回一个特定的字符串值。getConfig是Kotlin对象中方法,如下所示, 下面是我尝试的测试 我没有得到任何错误,但是getConfig方法没有被嘲笑。执行实际的实现。我也试过使用Powermockito。请帮帮我

  • 考虑为现有Azure Cosmos DB帐户启用地理冗余?但是如何模拟故障转移来进行测试呢 启用地理冗余后,考虑数据一致性有多重要? 一般性建议是什么 考虑地理冗余或数据一致性所需的任何代码更改?我们使用的是cosmosdb-sqlapi。

  • 问题内容: 我正在尝试为一些依赖WifiManager和返回的ScanResults的类实现一些单元测试。我想做的是能够控制我收到的ScanResults,以测试各种不同的条件。 不幸的是,对我来说,成功模拟WifiManager非常困难(尽管我想我可以在MockWifiManager中传递其构造函数null引用)。这只是我的第一个问题,因为一旦我有一个MockWifiManager可以玩(如果它

  • 问题内容: 如何模拟使用PowerMock进行测试的专用方法?我有一个类,我想使用一个调用私有方法的公共方法进行测试。我想假设私有方法可以正常工作。例如,我想要类似的东西。我发现有使用PowerMock的解决方案,但该解决方案对我不起作用。怎么做?有人有这个问题吗? 问题答案: 我在这里没有问题。使用Mockito API的以下代码,我做到了: 这是JUnit测试:

  • 问题内容: 嗨,我真的希望您能为我提供帮助,我感觉我已经把头发拉了好几天了。 我正在尝试为方法A编写单元测试。方法A调用静态方法B。我想模拟静态方法B。 我知道以前已经有人问过这个问题,但是我觉得Android从那时起已经成熟,并且必须有一种方法可以执行如此简单的任务,而无需重写我要测试的方法。 这是一个示例,首先是我要测试的方法: 接下来,我要模拟的静态方法: 在其他语言中,这是如此简单,但我无

  • Spock对存根和模拟做了很强的区分。当要更改的内容从被测试类使用的类返回时,请使用存根,这样您就可以测试if语句的另一个分支。使用mock,当您不关心测试中的类返回什么时,只需调用另一个类的另一个方法,并且您希望确保调用了该方法。很整洁。然而,假设您有一个具有流利API的构建器,它使人们。您希望测试调用此生成器的方法。 所以最初,我想只是模拟构建器,然后myMethod()的单元测试应该检查具有