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

Junit不能模拟类

房时铭
2023-03-14

当我尝试用PowerMock和Mockito测试一个方法并模拟它的依赖关系时遇到了问题。我尝试将依赖关系方法转换为非静态方法,并使用@mock注释和@injectmocks,但没有任何结果。

下面是正在测试的类和方法:

/* class to be tested */
public class LoginServiceImpl implements LoginService{

   /* method to be tested */
   @Override
   public String createJwt(String subject, String name, String permission, Date datenow)  throws java.io.UnsupportedEncodingException{
       Date expDate = datenow;
       expDate.setTime(datenow.getTime()+(300*1000));  //expiration time = 30 minutes

       String token = jwtUtils.generateJwt(subject, expDate, name, permission);
       return token;
   }
}

这里有一个我想要嘲弄的依赖关系,我很难嘲弄它:

/* Dependency I cannot mock */
public class JwtUtils {

    public static String generateJwt(String subject, Date date, String name, String scope) throws java.io.UnsupportedEncodingException{
        String jwt = Jwts.builder()
            .setSubject(subject)
            .setExpiration(date)
            .claim("name", name)
            .claim("scope", scope)
            .signWith(
                    SignatureAlgorithm.HS256,
                    "myPersonalSecretKey12345".getBytes("UTF-8")
            )
            .compact();

       return jwt;
   }
}

最后,但不是最不重要的是,使用失败的测试方法的测试类。我不得不说,它甚至没有到达assert方法调用,而是在when().ThenResult()处失败。我还必须指定我尝试使用doReturn()和any()作为匹配器,但没有结果。

@RunWith(MockitoJUnitRunner.class)          //to run Mockito
@PrepareForTest({JwtUtils.class})           //powerMock annotations tomock classes containing static methods
public class LoginServiceImplTest {

   @InjectMocks
   LoginServiceImpl loginService;          //System under test (SUT)

   @Test
   public void createJwtTest() throws Exception {

       SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
       Date expdate = ft.parse("2040-12-12");
       String jwt = JwtUtils.generateJwt("BDAGPP32E08F205K", expdate, "Pippo Baudo", "conduttore");
       //HERE IT'S WHERE IT FAILS:
       when(JwtUtils.generateJwt("BDAGPP32E08F205K", expdate, "Pippo Baudo", "conduttore")).thenReturn(jwt);

       assertThat(loginService.createJwt("BDAGPP32E08F205K", "Pippo Baudo", "conduttore", expdate), is(jwt));
   }
}

这里是JUnit和Mockito给我的错误:

进程已完成,退出代码为255

共有1个答案

赫连华皓
2023-03-14

尝试将@runwith(MockitoJunitRunner.Class)替换为@runwith(PowerMockRunner.Class)。据我所知,所有使用PowerMock特性的测试都必须使用PowerMockRunner运行。

 类似资料:
  • 我使用Spring Initializr生成了一个Spring Bootweb应用程序,使用嵌入式Tomcat+Thymeleaf模板引擎,并将其打包为一个可执行的JAR文件。 类NexTelsMSSender: . 但这似乎并不是在嘲弄对象属性,因为当我打包应用程序时。我有一个错误:

  • 本节介绍与JUnit Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 JUnit Mock Test I 问题1 - 以下哪项描述正确测试? A - 测试是检查应用程序功能的过程,是否按照要求运行。 B - 测试是单个实体(类或方法)的测试。 C - 以上两者。 D - 以上都

  • 我试图编写一些基本的backingBean测试,但我一直在模仿UserContext和facesContext。 此代码在我尝试测试的代码中: 在另一段代码中,我得到了以下内容: 如何在标准jUnit测试中仅使用mockito来模拟这些?还是必须使用PowerMock之类的工具?

  • 我试图模拟一个公共类,但是当这样做时,Mockito抛出一个异常。 我想嘲弄的班级:https://github.com/scribejava/scribejava/blob/master/scribejava-core/src/main/java/com/github/scribejava/core/builder/ServiceBuilder.java 测试代码: 完整堆栈跟踪:

  • 问题内容: 我在源代码中使用了BufferedWriter对象 我正在尝试在我的测试用例中模拟它,如下所示: 但是,BufferedWriter不会被嘲笑,它总是进入实际的实现中。是因为它不能模拟BufferedWriter,因为它是一个具体的类吗?这是否意味着无法模拟任何java.io类?有没有办法模拟它,或者我做错了什么? 问题答案: ,你可以嘲笑的Java IO类(包括它们的构造,所以未来的