- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在使用 TDD 构建一个类。该类负责等待特定窗口变为事件状态,然后触发某些方法。
我正在使用 AutoIt COM 库(有关 AutoIt 的更多信息请查看 here )因为我想要的行为实际上是 AutoIt 中的一个方法。
代码大致如下:
public class WindowMonitor
{
private readonly IAutoItX3 _autoItLib;
public WindowMonitor(IAutoItX3 autoItLib)
{
_autoItLib = autoItLib;
}
public void Run() // indefinitely
{
while(true)
{
_autoItLib.WinWaitActive("Open File", "", 0);
// Do stuff now that the window named "Open File" is finally active.
}
}
}
如您所见,AutoIt COM 库实现了一个我可以模拟的接口(interface)(使用 NUnit 和 Rhino Mocks):
[TestFixture]
public class When_running_the_monitor
{
WindowMonitor subject;
IAutoItX3 mockAutoItLibrary;
AutoResetEvent continueWinWaitActive;
AutoResetEvent winWaitActiveIsCalled;
[SetUp]
public void Setup()
{
// Arrange
mockAutoItLibrary = MockRepository.GenerateStub<IAutoItX3>();
mockAutoItLib.Stub(m => m.WinWaitActive("", "", 0))
.IgnoreArguments()
.Do((Func<string, string, int, int>) ((a, b, c) =>
{
winWaitActiveIsCalled.Set();
continueWinWaitActive.WaitOne();
return 1;
}));
subject = new Subject(mockAutoItLibrary)
// Act
new Thread(new ThreadStart(subject.Run)).Start();
winWaitActiveIsCalled.WaitOne();
}
// Assert
[Test]
[Timeout(1000)]
public void should_call_winWaitActive()
{
mockAutoItLib.AssertWasCalled(m => m.WinWaitActive("Bestand selecteren", "", 0));
}
[Test]
[Timeout(1000)]
public void ensure_that_nothing_is_done_while_window_is_not_active_yet()
{
// When you do an "AssertWasCalled" for the actions when the window becomes active, put an equivalent "AssertWasNotCalled" here.
}
问题是,第一个测试总是超时。我已经发现,当调用 stub “WinWaitActive”时,它会阻塞(如预期的那样,在单独的线程上),并且当之后调用“AssertWasCalled”时,执行永远不会返回。
我不知道如何继续,我找不到任何模拟阻塞调用的例子。
总而言之:
有没有办法在不使测试超时的情况下模拟阻塞调用?
(附:我对更改设计不太感兴趣(即“不要使用阻塞调用”),因为在这里可以这样做,但我确信在某些情况下更难做到更改设计,我对更通用的解决方案感兴趣。但如果模拟阻塞调用根本不可能,那么我们更欢迎这样的建议!)
最佳答案
不确定我是否理解问题。
您的代码只是在模拟 (WinWaitActive
) 上调用一个方法。当然,它不能在调用返回之前继续。这是编程语言的本质,无需测试。
因此,如果您测试 WinWaitActive
被调用,您的测试就完成了。您可以测试 WinWaitActive
是否在其他任何事情之前被调用,但这需要有序的期望,这需要旧式 rhino 模拟语法并且通常不值得这样做。
mockAutoItLibrary = MockRepository.GenerateStub<IAutoItX3>();
subject = new Subject(mockAutoItLibrary)
subject.Run()
mockAutoItLib.AssertWasCalled(m => m.WinWaitActive("Open File", "", 0));
除了调用方法之外,您无需执行任何其他操作...因此没有其他任何可测试的内容。
编辑:退出死循环
您可以通过从模拟中抛出异常来使其退出无限循环。这不是很好,但它避免了在单元测试中使用所有这些多线程的东西。
mockAutoItLibrary = MockRepository.GenerateStub<IAutoItX3>();
// make loop throw an exception on second call
// to exit the infinite loop
mockAutoItLib
.Stub(m => m.WinWaitActive(
Arg<string>.Is.Anything,
Arg<string>.Is.Anything,
Arg<int>.Is.Anything));
.Repeat.Once();
mockAutoItLib
.Stub(m => m.WinWaitActive(
Arg<string>.Is.Anything,
Arg<string>.Is.Anything,
Arg<int>.Is.Anything));
.Throw(new StopInfiniteLoopException());
subject = new Subject(mockAutoItLibrary)
try
{
subject.Run()
}
catch(StopInfiniteLoopException)
{} // expected exception thrown by mock
mockAutoItLib.AssertWasCalled(m => m.WinWaitActive("Open File", "", 0));
关于c# - 使用 Rhino Mocks 模拟阻塞调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216242/
尝试使用 RhinoMock 模拟函数。 var repository = new Rhino.Mocks.MockRepository(); var classMock = repository.D
我已经阅读了很多示例/教程(包括 Ayende 在 MSDN 上的 Alexandria)。 但事实证明,仅仅获得一些更新的程序集本身就是一个障碍。获得正确版本的 CaSTLe.Windsor 后 -
我正在使用 java 运行用 Rhino 编写的命令行实用程序,但如果出现错误,我需要将该错误返回给 shell,以便停止处理。如何将错误代码从 Rhino 传回给 shell? 最佳答案 你可以用
为了它的乐趣,我尝试使用 envjs 在 Rhino 中运行 JSLinux,它似乎没有抛出任何错误,也似乎不起作用。 如此处所述:How do I locally host the webbrows
有谁知道为什么 UsernameExists 不会返回 True。我的语法一定在某个地方搞砸了。 [TestMethod()] public void GenerateUsername
Rhino Mock 库是否有可比较且可靠的替代品。我现在将 Rhino 用于 MVC ASP.NET 项目,但正在考虑(就像计划 B)看看是否有任何其他等效的替代方案。 最佳答案 RhinoMock
我有一个 Java 7 项目,该项目大量使用 Javascript 来编写各种功能的脚本。到目前为止,我一直使用 Rhino 作为脚本引擎。我现在想迁移到 Java 8,这也意味着我将用 Nashor
我正在寻找一种让 stub 的返回值取决于其输入的干净方法。 目前我正在使用以下方法,但效果不佳。 metadataLogic.Expect(x => x.GetMake(args.Vehicle1.
我正在设置调用构建和执行查询的方法的期望。我想询问所用参数的属性。这可能吗 using (mocks.Record()) { Expect.Call(connection.Retrieve(S
有没有人有一个使用 Rhino Mocks 和 NInject 的自动模拟容器的实现? 最佳答案 好的,我使用 Moq 集成作为起点自己构建了一个。这很简单。你需要这 3 个类: public cla
谁能告诉我为什么下面的测试没有失败? [Test] public void uhh_what() { var a = MockRepository.GenerateMock(); a.
有人可以分享下载最新版本的 Rhino 模拟二进制文件的链接吗(仅限二进制文件,我不需要源文件)?链接 http://ayende.com/projects/rhino-mocks/downloads
我最近才开始使用 Rhino-Etl对于非常简单的 ETL 过程,并取得了巨大的成功。我现在有一个稍微复杂的场景要解决,但我没有发现 ConventionInputCommandOperation 以
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我通常是单元测试和模拟的新手,并且正在尝试为我的一个类设置测试,我想确保从同一类中的另一个方法调用特定方法。因此,我想使用具体的实现,但要模拟它的一部分。这可能吗? 公共(public)课 MyCla
我一直在阅读有关 Rhino 的文章,认为这是一种在我的 Java 代码中实现 JavaScript 的有用方法。 在阅读了一段时间后,在 google 和这里进行了搜索,我找不到在 Java 中
我正在尝试使用 Rhino 服务总线在 1 个发布者和多个订阅者之间设置发布-订阅。然而,我似乎得到的只是竞争消费者(消息在一个消费者或另一个消费者之间分发,但不发送给两者)。 我当前的发布者配置如下
我有一个设置属性的方法 public void SetNetworkCredential(string userName, string password, string domain) {
有没有比以下 kludge 更简洁的方法来获取 Javascript 对象的 JSON 表示? System.out.println(((ScriptableObject) scope).callMe
好的,我知道 Rhino Mocks 中新的 AAA 语法存在很多混淆,但我必须说实话,从我目前所看到的来看,我喜欢。它读起来更好,并节省了一些击键。 基本上,我正在测试 ListController
我是一名优秀的程序员,十分优秀!