我有一个 cfc,它的许多核心功能在很大程度上依赖于 Java 对象(通过 JavaLoader 创建),我想为其编写一些测试,但我不确定这样做的最佳方法是什么。这是我想用 instance.note 作为 java 对象编写测试的方法示例。

<cffunction name="getNotes" returntype="Array" access="public" output="false" hint="I return a list of a users notebooks" >
    <cfargument name="maxCount" type="numeric" required="false" default="9999" hint="The maximum number of notes to get" />
    <cfscript>
        if(arguments.maxCount)
            return instance.note.listNotes(maxCount);
        else
            return instance.note.listNotes();
    </cfscript>
</cffunction>

我想做的一件事是创建一个具有相同方法名称和相似返回值的 stub CFC,然后模拟该 stub 并注入(inject)它?

最佳答案

当我们需要对依赖 Java 对象(我们做了很多)的 CF 函数进行单元测试时,我们使用 Mockito 来模拟 Java 对象。

所以,希望这个代码片段有意义,自从我这样做已经快一年了:

<cfcomponent displayname="TestWhatever" extends="mxunit.framework.TestCase" output="false">

    <cffunction name="setUp" access="public" returntype="void">
      <cfscript>
        // named it mk for keeping it short
        variables.mk = createObject("java","org.mockito.Mockito");

        //Create the mock object
        variables.mockNote = mk.mock(createObject("java","com.company.whatever.note").getClass());

        // Mock Data
        fullList = {whatever listNotes() returns}
        partialList3 = {whatever listNotes(3) returns}

        //some common mocking
        mk.when(variables.mockNote.listNotes()).thenReturn(fullList);
        mk.when(variables.mockNote.listNotes(mk.eq(3))).thenReturn(partialList3);
        mk.when(variables.rootOrgObj.guid()).thenReturn("root");

        // Assign the mock object to where your CFC expects it.
        instance.note = variables.mockNote
      </cfscript>
    </cffunction>

</cfcomponent>

话虽如此,如果您的示例函数是真实的,那么对它进行单元测试真的没有意义。它只是不做任何事情,只是作为 java 对象的代理。那里没有要测试的重要逻辑。

由于您在 cfargument 上有一个默认值,它会一直存在(同样,我认为是这样,自从我完成 CF 已经一年了),所以甚至不需要您的守卫语句 - 第一个代码路径将始终被调用,如果指定,则使用传递的 maxCount,否则使用 9999。

关于coldfusion - 对使用 Java 对象来实现许多功能的 cfc 进行单元测试的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6693012/

10-13 06:16
查看更多