- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 jMockIt 框架比较陌生,几个月前我开始在一个个人项目中使用它,目的是在我们的一个企业项目中对其进行调整。到目前为止,它看起来很有前途,它看起来是我们目前已有的 Mockito + Powermock 组合的一个很好的替代品。不应阅读此声明,因为我不是在提倡简单性,而是没有义务为了让事情更容易测试而妥协您的设计,这绝对非常有吸引力。
在我看来,另一件吸引人的事情是严格期望的可用性。我理解这个概念的方式是,如果我使用多个模拟协作者对被测类进行测试,那么不设置与这些模拟协作者的确切交互将导致测试失败。实际上这似乎并没有发生。在我看来,为了让模拟协作者的交互受到监控,您至少需要针对该模拟协作者设定一个期望值。
当我意识到这一点时,我感到有点失望,因为在添加新协作者时它很容易导致未经测试的代码。希望我的方法不是正确的,并且这里的某个人能够让我走上正确的方向。我整理了一个简短的测试用例,以便更容易重现我所说的内容。
package my.testing.pkg;
import mockit.Mocked;
import mockit.StrictExpectations;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
@RunWith(JMockit.class)
public class LoggerTest {
class ClassUnderTest {
private final Logger logger = Logger.getLogger(ClassUnderTest.class);
String getString() {
logger.debug("about to return a string");
return "xyz";
}
}
@Mocked
private Logger logger;
@Test
public void shouldReturnTheRightString() throws Exception {
new StrictExpectations() {{
}};
assertEquals("xyz", new ClassUnderTest().getString());
new Verifications() {{
logger.debug("about to return a string");
}};
}
}
以上单元测试通过。如果您注释掉整个验证 block ,或者如果您没有验证 block 并将记录器交互移动到期望 block 中,它也会通过。我的预期是,如果我有一个模拟记录器并且与该记录器有交互,那么缺少与该记录器相关的严格期望或验证条目将导致我的测试失败。
提前感谢您的任何澄清。
最佳答案
JMockit 不支持在创建时声明为严格的模拟对象;相反,如果在其上记录了 StrictExpectation
,它支持将模拟类型或实例转换为严格类型或实例,并验证是否通过 FullVerifications
明确说明了所有调用。因此,您不能只声明一个模拟字段/参数并让测试失败而不为该模拟编写任何期望或验证。
虽然可以将 @Mocked(strictly = true)
属性 添加到 API,但问题是严格模拟在多年前就变得“不受欢迎”(无论是在Java 和 .NET 领域)。对于 JMockit,可以选择在测试结束时进行验证,仅使用非严格模拟。所以,今天,如果你想要严格的模拟,你将不得不使用 EasyMock 或 jMock;此时,最好将其保留在 JMockit 中。
关于java - jMockIt StrictExpectations 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29960052/
我有这个抽象类: public abstract class Accessor { public U find(T id) { // let's say r
我正在尝试使用 JMockit 对 Android 应用程序进行单元测试。这有点棘手,因为在本地 JVM 中执行测试意味着所有 Android 类都是 stub ,但您可以模拟它们,这不是问题。 但现
public class HuronClassloader extends URLClassLoader { public HuronClassloader(Logger logger) {
我有一个正在 mock 的方法,以避免在单元测试期间进行网络调用,它看起来像这样: InputStream sendRequestAndReturnResponseStream(String para
我有这样的东西: new Expectations() {{ mock0.f(); mock1.f(); mock0.f(); mock1.f(); mock0
我已经将 JMockit 设置为与一些 JUnit 测试一起使用,也使用 Robolectric,但我遇到了错误。我主要使用 maven 来运行测试。 当我使用 mvn test 运行测试并且 jav
我正在将一些测试用例从 JMock 迁移到 JMockit。到目前为止,这是一段愉快的旅程,但是 JMock 中有一项我无法在 JMockit(版本 0.999.17)中找到的功能 我想检查模拟是否从
我不认为 minInvocation 或 maxInvocation 等同于 Mockito 中的 times() 。在那儿? 请看这个问题:Major difference between: Moc
当我使用 JUnit 5 和 JMockit 使用以下测试方法时,出现以下错误: JMockit 没有被初始化;请检查 -javaagent JVM 初始化参数是否被使用 这些是我创建并想要测试的类:
我长期以来一直在使用 JMockit。我想了解 @Tested 是如何工作的。 今天我尝试在我的测试类中使用它。我的理解是,无论我们想要测试什么类,我们都可以将其标记为@Tested。 让我对此行为感
我正在尝试使用 EMMA 来衡量一些使用 JMockit 的 JUnit 测试的覆盖率。但是当我在使用 EMMA 进行检测后尝试运行 JMockit 测试时,大约四分之一的测试失败并出现以下错误: c
我正在将用 JUnit 4 编写的单元测试转换为 JUnit 5。当被测试的方法调用静态方法时,我们使用 JMockit。 在 JUnit 4 中, @RunWith(JMockit.class) p
我在以下场景中使用 jmockit 时遇到问题。在网上查了一下,但还没有找到答案。 在记录阶段,我对部分模拟的对象设置期望。在执行此操作时,我想模拟具有单个参数的私有(private)方法。但我并不真
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我正在尝试使用以下代码使用 jmockit1.43 模拟 System.currentTimeMillis private static class SystemMock extends MockUp
当我尝试运行 Junit 测试用例时,我遇到了异常。 如果我正在更改类路径条目顺序,它工作正常,但 Jococo 覆盖不起作用。它正在挂起。 任何人都可以帮助解决这个问题。 java.lang.I
假设我的被测系统是这样的: public class SysUnderTest { public int foo() { Trouble trouble1 = new Trou
我正在我的应用程序中使用 JMockit 为 DAO 编写单元测试用例,为此我必须模拟 spring 的 jdbcTemplate,以便不会对数据库进行任何调用。我看过其他帖子/示例讨论模拟 DAO,
假设我的被测系统是这样的: public class SysUnderTest { public int foo() { Trouble trouble1 = new Trou
希望这里对某人来说是一个简单的问题...... 我正在使用 RAD 7.5.2,并且正在编写 Junit 测试。我用 JUnit 3 编写它们很好,然后我想模拟一些函数调用。所以我加载了 jmocki
我是一名优秀的程序员,十分优秀!