Hi Christopher,

The jersey test framework spawns a new thread and run a servlet container
for your tests, so that it doesn't work well with App Engine's test
helpers. I also recommend you write real unit tests against your Jersey
resources, as Alex's recommendation.

Fortunately, now we have complete example for it. I've just written a
sample which contains some unit tests against jersey resource classes. The
sample is available at:
https://github.com/GoogleCloudPlatform/appengine-angular-guestbook-java

What I've done is basically the same as Alex suggested. The project also
includes unit tests for client side javascript , and end to end tests with
Angularjs testing framework. Please take a look if you're interested in.

-- Takashi

On Sun, Aug 19, 2012 at 1:39 PM, Christopher Armstrong
<[email protected]>wrote:

> Hi Alex,
>
> Thanks for the example. This helps as I'm new to Mocking. Now I know what
> I'll be doing Monday evening :)
>
> Kind regards,
> Chris
>
>
> On Sunday, August 19, 2012 10:10:34 PM UTC+2, alex wrote:
>>
>> I think you can do it with pretty much any mock framework, but to give
>> you an idea of what I mean in the prev. msg:
>>
>> ServletInputStream stream = new MockInputStream(some_bytes_or_**
>> string_data);
>> request = mock(HttpServletRequest.class)**;
>> when(request.getInputStream())**.thenReturn(stream);
>> when(request.getServletPath())**.thenReturn(some_path);
>> ...
>>
>> response = mock(HttpServletResponse.**class);
>> output = new StringWriter();
>> when(response.getWriter()).**thenReturn(new PrintWriter(output));
>>
>> - MockInputStream is really just a ServletInputStream only that it takes
>> a string (fake request data) as a constructor param.
>> - mocking getWriter() is just an sample I've taken from one of our app
>> where I know it always uses getWriter(), otherwise I'd mock other methods.
>>
>> The above would be defined somewhere a BaseTest class, so our tests
>> really boil down to something like:
>>
>> public void testSomething() {
>>   resp = get("/some/path?query=goes&**here=too")
>>   // or post(payload)
>>
>>   // do something with resp,
>>   // e.g. make assertions
>> }
>>
>> Maybe there's a better way but the idea above works pretty well for us.
>>
>>
>> On Sunday, August 19, 2012 9:26:23 PM UTC+2, Christopher Armstrong wrote:
>>>
>>> Hi Alex,
>>>
>>> Thanks for your valuable input. I'll take a look at Mockito.
>>>
>>> Kind regards,
>>> Chris
>>>
>>> On Sunday, August 19, 2012 7:43:34 PM UTC+2, alex wrote:
>>>>
>>>> I never used Jersey but what we're doing in this kind of testing is
>>>> simply mocking (HttpServletRequest)request.**getInputStream() and a
>>>> couple other methods  so that they would operate on payloads provided
>>>> within the unit tests or files on a disk, and (mocked) Response would write
>>>> to a string (instead of real HTTP communication).
>>>>
>>>> Nice thing about this is the tests are run really fast as no external
>>>> processes (e.g. dev server) are launched during testing. Plus, Testbed is
>>>> always available  in case there's a need to check some internal states.
>>>> Also, the only external lib dependency (testing-wise) with which we mock
>>>> classes like HttpServletResponse is **Mockito.
>>>>
>>>>
>>>> On Sunday, August 19, 2012 2:54:40 PM UTC+2, Christopher Armstrong
>>>> wrote:
>>>>>
>>>>> Hello,
>>>>>
>>>>> I'm currently developing an application in Java and want to use
>>>>> AppEngine. My setup uses Jersey JSON/REST to exchange data between the
>>>>> client and the server.
>>>>>
>>>>> I would like to do following in the development mode with JUnit:
>>>>> * Start AppEngine
>>>>> * Execute Tests
>>>>> * Stop AppEngine
>>>>>
>>>>> I have had two threads open on Stackoverflow. First thread was how I
>>>>> can start AppEngine over Junit without spawning threads so that I can test
>>>>> my REST resources. I have been told that this is an integration test and
>>>>> Junit can't be used for that. I should try to test by executing the 
>>>>> methods
>>>>> of the resource class directly. Ok, I was thinking but it is somehow funny
>>>>> because when reading the Jersey docs they suggest exactly this. Starting a
>>>>> webserver to test the REST resources with Junit.
>>>>>
>>>>> I tried then to execute the methods directly and this worked at least
>>>>> for the getStatus() method from the Response class. But when I execute the
>>>>> methods directly and want to use getEntity() method of the Response class 
>>>>> I
>>>>> can't marshal the object back in to the entity class. So this isn't 
>>>>> working
>>>>> either out of some reason and I'm unable get the created record back so
>>>>> that I have the contents.
>>>>>
>>>>> Is there any best practice provided by Google to test REST interfaces
>>>>> in an automated manner or does anybody know how to test jersey resource
>>>>> classes properly (without curl on the command line)?
>>>>>
>>>>> Its nice that I'm doing it all wrong and that Junit has nothing to do
>>>>> with Integration testing but somehow I need to test my classes. It would 
>>>>> be
>>>>> great if somebody could give me a hint.
>>>>>
>>>>> Thanks,
>>>>> Chris
>>>>>
>>>>>  --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/google-appengine/-/buJYfYz-dfUJ.
>
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/google-appengine?hl=en.
>



-- 
Takashi Matsuo | Developers Programs Engineer | [email protected]

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-appengine?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to