代码之家  ›  专栏  ›  技术社区  ›  black sensei

用easymock验证对象类型

  •  2
  • black sensei  · 技术社区  · 16 年前

    我刚刚来到easymock的世界,我想问一下easymock是否只做接口的模拟对象? 因此,在我努力理解的过程中,我编写了一个类来在Java中生成唯一的凭证。很明显,我不知道它会生成什么样的值来使用断言。因此,如何确保生成的凭证是长类型的?

    这是功能

     public static Long generateID(int length) {
        logger.info("Calling generateID with specify length");
        Long result = null;
    
        if (length > 0) {
            StringBuffer id = new StringBuffer(length);
            for (int i = 0; i < length; i++) {
                id.append(NUMS[(int)Math.floor(Math.random() * 20)]);
            }
            result = Long.parseLong(id.toString());
        }
    
        return result;
    }
    

    这是测试课

    @Before
    public void setUp() {
        mockgenerator = createMock(VGenerator.class);
    }
    
    
    /**
     * Test of generateID method, of class VGenerator.
     */
    @Test
    public void testGenerateID() {
       Long exp = (long)1;
       int length = 15;
        expect(mockgenerator.generateID(length)).equals(Long.class);
        replay(mockgenerator);
        long res = mockgenerator.generatedID(length);
        assertEquals(exp.class, res.class);
    }
    

    好吧,这对你来说可能很好,但我还是不知道该怎么做 谢谢你的帮助

    3 回复  |  直到 16 年前
        1
  •  0
  •   Wim Coenen    16 年前

    如果返回类型 long 你要确保未来的改变不会不经意地改变这一点,那么你就不需要轻松。只要这样做:

    @Test
    public void TestGenerateIDReturnsLong()
    {
       Method method = 
          VGenerator.class.getDeclaredMethod("generateID", new Class[0]);
       Assert.Equals(long.Class, method.GetReturnType());
    }
    

    当前正在生成的模拟实现 VGenerator 然后你测试模型。这是 有用的。单元测试的重点是测试一个真正的实现。所以现在你可能想知道什么样的模拟是好的?

    举个例子,想象一下 向量发生器 需要在内部使用随机数生成器,并在构造函数中提供此生成器(称为“依赖注入”):

    public VGenerator
    {
        private final RandomNumberGenerator rng; 
    
        // constructor
        public VGenerator(RandomNumberGenerator rng)
        {
           this.rng = rng;
        }
    
        public long generateID(length)
        {
           double randomNumber = this.rng.getRandomNumber();
           // ... use random number in calculation somehow ...
           return id;
        }
    }
    

    实施时 向量发生器 ,您对测试随机数生成器并不真正感兴趣。你感兴趣的是 向量发生器 调用随机数生成器,以及它如何使用结果生成输出。为了测试的目的,您需要完全控制随机数生成器,因此您创建了一个模拟 :

    @Test
    public void TestGenerateId()
    {
       RandomNumberGenerator mockRNG = createMock(RandomNumberGenerator.class);
       expect(mockRNG.getRandomNumber()).andReturn(0.123);
       replay(mockRNG);
    
       VGenerator vgenerator = new VGenerator(mockRNG);
       long id = vgenerator.generateID();
       Assert.Equals(5,id); // e.g. given random number .123, result should be 5
    
       verify(mockRNG);
    }
    
        2
  •  3
  •   Andrew Sunil Kumar B M    16 年前

    我相信你误解了如何使用Easymock, 调用Expect会告诉模拟对象,当您重放它时,应该调用这个调用。在我的示例中,appending.andreturn()告诉模拟对象返回您在其中放入的任何内容,一个长值为1。 easymock的要点是,您不需要实现模拟接口来测试使用它的类。 通过模拟,您可以将一个类与它所依赖的类隔离开来,并且只测试当前正在测试的类所包含的代码。

    interface VGenerator {
         public Long generateID(int in);
    }
    
    
    @Before
    public void setUp() {
        mockgenerator = createMock(VGenerator.class);
    }
    
    
    @Test
    public void testGenerateID() {
         int length = 15;
         expect(mockgenerator.generateID(length)).andReturn(new Long(1));
         replay(mockgenerator);
         myMethodToBeTested();
         verify(mockgenerator);
    }
    
    public void myMethodToBeTested(){
        //do stuff
        long res = mockgenerator.generatedID(length);
        //do stuff
    }
    

    如果我误解了你的问题,那么它真的是,easymock只是模拟接口吗?那么答案是肯定的,easymock只模拟接口。阅读文档以获取更多帮助 Easymock

        3
  •  0
  •   Henry    16 年前

    EasyMock Class extension 可以模拟课堂。这是Easymock的扩展。它仍然可以模拟接口,所以它几乎可以替代easymock。

    然而,在您的案例中,您试图模拟一个静态方法。静态方法不能被模拟,因为它们不能被重载。你需要类工具来完成这项工作,而Easymock不需要。