首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写创建新线程的单元测试

如何编写创建新线程的单元测试
EN

Stack Overflow用户
提问于 2015-02-10 00:17:03
回答 2查看 166关注 0票数 3

我有以下测试方法:

代码语言:javascript
运行
复制
public class classToTest{
    @Autowired
    private Alternator alternator;

     public void methodToTest(){
         Thread t = new Thread(new Runnable() {
             public void run() {
                 while(true) {
                     if(alternator.get()) {
                         System.out.print("Hello");
                         alternator.set(false);
                     }
                 }
             }
          };
          t.start()
    }
}

我需要检查被调用的方法

代码语言:javascript
运行
复制
alternator.set(false);

我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2015-02-10 01:35:24

你可以传入一个"Executor“实例,而不是直接启动一个线程吗?

例如..。

代码语言:javascript
运行
复制
public class ClassToTest{
    @Autowired
    private Alternator alternator;

    @Autowired @Qualifier("myExecutor")
    private java.util.concurrent.Executor executor;

    public void methodToTest() {
        Runnable runnable = new Runnable() {
           public void run() {
               while(true) {
                 if(alternator.get()) {
                     System.out.print("Hello");
                     alternator.set(false);
                 }
             }
        };

        executor.execute(runnable);
    }
}

现在你可以更容易的测试它了。

代码语言:javascript
运行
复制
public class ClassToTestTest {

    ...

    @Before
    public void setup() {
        alternator = mock(Alternator.class);
        executor = mock(Executor.class);

        obj = new ClassToTest();
        ReflectionTestUtils.setField(obj, "alternator", alternator);
        ReflectionTestUtils.setField(obj, "executor", executor);
    }

    @Test
    public void shouldStartRunnable() {
        obj.methodToTest();

        ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class);

        verify(executor).execute(runnableCaptor.capture());

        Runnable runnable = runnableCaptor.getValue();

        // Now test your actual "runnable"...
        when(alternator.get()).thenReturn(true);
        runnable.run();

        verify(alternator).set(false);
    }
}

(我没有尝试编译这篇文章,所以如果有任何错误,我深表歉意!)

票数 0
EN

Stack Overflow用户

发布于 2015-02-10 08:29:34

尽管非常推荐使用传入executor的模拟验证,但您也可以使用timeout() Bret's post验证设置来测试异步条件。

代码语言:javascript
运行
复制
verify(alternator, timeout(500)).set(false);

请注意,这必然会增加测试的易损性(即当代码通过时测试失败的可能性)。有了一个合理的超时值,这种剥落应该可以忽略不计,但如果您将其作为核心测试基础设施的一部分,则可以考虑重构以允许在测试中同步执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28414257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档