首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟CGLIB增强对象

模拟CGLIB增强对象
EN

Stack Overflow用户
提问于 2013-11-02 03:39:12
回答 4查看 3.6K关注 0票数 7

mockito真的不能模拟已经被CGLIB增强的对象吗?

代码语言:javascript
复制
public class Article {

     @Autowired
     private dbRequestHandler

     @Autowired
     private filesystemRequestHandler

     @Transactional
     public ArticleDTO getArticleContents() {

         //extractText() and then save the data in DTO
         //extractImages() and then save the data in DTO
         // some other calls to other databases to save data in dto

       return articleDTO;

     }
     public void extractText() {

        //call to DB

   }

   public void extractImages() {

        // call to file system

   }
}


public class IntegrationTest {

  @Autowired
  private Article article;

  //setup method {

  articleMock = Mockito.spy(article);

  doNothing().when(articleMock).extractImages();
 }
}

在上面的例子中,当涉及到doNothing().when(articleMock).extractImages();时,它实际上调用了真正的函数。仔细一看,articleMock得到了两倍的增强。一次导致autowiring,第二次导致spying

如果我不能监视增强的对象,那么我如何在集成测试中测试getArticle()方法,以便我可以验证是否返回了正确的DTO。

注意:我实际上不想测试执行文件系统调用的方法。只有数据库里的。这就是为什么我需要测试getArticle方法的原因。

EN

回答 4

Stack Overflow用户

发布于 2013-11-07 06:53:36

如果我理解正确的话,您的类是由Spring连接的。Spring使用CGLIB来确保只有在没有接口时的事务性行为,该接口是由您的对象实现的。如果有接口,则使用简单的JDK动态代理。(参见http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s06.html)

也许你可以尝试提取一个接口,让Spring使用动态代理。也许那样Mockito就能表现得更好。

票数 3
EN

Stack Overflow用户

发布于 2013-11-07 07:24:55

如果你是作为一个真正的单元测试运行,而不是作为一个集成测试,那么你不需要在一个有Spring自动测试的容器中运行。在您的一条评论中,我认为您暗示要尝试这样做,并且您注意到有一组无穷无尽的链接对象引用,您也必须提供这些引用。但有一种方法可以绕过这一点。Mockito提供了一些预定义的Answer类,您可以使用这些类来初始化模拟。您可能想看看RETURNS_DEEP_STUBS,它可能会帮助您解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2013-11-11 01:31:02

请用现成的可编译代码更新您的问题。以下是一些代码审查建议:

此问题代码的问题:

返回方法缺少import: org.springframework.beans.factory.annotation.Autowired

  • Article.java缺少import: org.springframework.transaction.annotation.Transactional

  • Article.java属性语法问题: dbRequestHandler

  • Article.java属性语法问题: filesystemRequestHandler

  • Article.java

  • Article.java没有初始化的返回语句: articleDTO

在修复了上述问题后,您可能应该在questionCode中使用以下内容:

Article.java

代码语言:javascript
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

public class Article {

    @Autowired
    private Object dbRequestHandler;

    @Autowired
    private Object filesystemRequestHandler;

    @Transactional
    public ArticleDTO getArticleContents() {

        // extractText() and then save the data in DTO
        // extractImages() and then save the data in DTO
        // some other calls to other databases to save data in dto

        ArticleDTO articleDTO = null;
        return articleDTO;

    }

    public void extractText() {

        // call to DB

    }

    public void extractImages() {

        // call to file system

    }
}

对于testClass来说,IntegrationTest.java不是一个好名字,因为它太泛型了。我建议使用ArticleTest进行java单元测试。

ArticleTest.java

代码语言:javascript
复制
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.beans.factory.annotation.Autowired;

@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithPrivate.class)
public class ArticleTest {

    @InjectMocks
    private Article cut;

    @Mock
    private Object dbRequestHandler;

    @Mock
    private Object filesystemRequestHandler;

    @Test
    public void testeExtractImages() {

        /* Initialization */
        Article articleMock = Mockito.spy(cut);

        /* Mock Setup */
        Mockito.doNothing().when(articleMock).extractImages();

        /* Test Method */
        ArticleDTO result = cut.getArticleContents();

        /* Asserts */
        Assert.assertNull(result);

    }

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

https://stackoverflow.com/questions/19734175

复制
相关文章

相似问题

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