I just re-read the discussion on the original Jira.

It's still a little unclear to me, how this should work end-to-end? It
would be good, to describe some test patterns that we want to support
first. Maybe using some examples, that show how a test would be written?

I don't think that we should build a whole mocking framework similar to
EasyMock (or others); why re-invent the wheel? I think the goal should
be, to allow people to use their mocking framework of choice, and to
easily integrate it with `TopologyTestDriver`, without the need to
rewrite the code under test.


For the currently internal `KeyValueStoreTestDriver`, it's seems to be a
little different, as the purpose of this driver is to test a store
implementation. Hence, most users won't need this, because they use the
built-in stores anyway, ie, this driver would be for advanced users that
build their own stores.

I think it's actually two orthogonal things and it might even be good to
split both into two KIPs.



-Matthias


On 4/30/19 7:52 AM, Yishun Guan wrote:
> Sounds good! Let me work on this more and add some more information to this
> KIP before we continue.
> 
> On Tue, Apr 30, 2019, 00:45 Bruno Cadonna <br...@confluent.io> wrote:
> 
>> Hi Yishun,
>>
>> Thank you for continuing with this KIP. IMO, this KIP is very important to
>> develop robust code.
>>
>> I think, a good approach is to do some research on mock development on the
>> internet and in the literatures and then try to prototype the mocks. These
>> activities should yield you a list of pros and cons that you can add to the
>> KIP. With this information it is simpler for everybody to discuss this KIP.
>>
>> Does this make sense to you?
>>
>> Best,
>> Bruno
>>
>> On Mon, Apr 29, 2019 at 7:11 PM Yishun Guan <gyis...@gmail.com> wrote:
>>
>>> Hi,
>>>
>>> Sorry for the late reply, I have read through all your valuable
>>> comments. The KIP still needs work at this point.
>>>
>>> I think at this point, one question comes up is that, how should we
>>> implement the mock stores - as Sophie suggested, should we open to all
>>> Store backend and just wrap around the Store class type which the user
>>> will be providing - or, as Bruno suggested, we shouldn't have a
>>> production backend store to be wrapped around in a mock store, just
>>> keep track of the state of each method calls, even EasyMock could be
>>> one of the option too.
>>>
>>> Personally, EasyMock will makes the implementation easier but building
>>> from scratch provides extra functionality and provides expandability
>>> (But I am not sure what kind of extra functionality we want in the
>>> future).
>>>
>>> What do you guys think?
>>>
>>> Best,
>>> Yishun
>>>
>>> On Fri, Apr 26, 2019 at 2:03 AM Matthias J. Sax <matth...@confluent.io>
>>> wrote:
>>>>
>>>> What is the status of this KIP?
>>>>
>>>>
>>>> Btw: there is also KIP-456. I was wondering if it might be required or
>>>> helpful to align the design of both with each other. Thoughts?
>>>>
>>>>
>>>>
>>>> -Matthias
>>>>
>>>>
>>>> On 4/11/19 12:17 AM, Matthias J. Sax wrote:
>>>>> Thanks for the KIP. Only one initial comment (Sophie mentioned this
>>>>> already but I want to emphasize on it).
>>>>>
>>>>> You state that
>>>>>
>>>>>> These will be internal classes, so no public API/interface.
>>>>>
>>>>> If this is the case, we don't need a KIP. However, the idea of the
>>>>> original Jira is to actually make those classes public, as part of
>> the
>>>>> `streams-test-utils` package. If it's not public, developers should
>> not
>>>>> use them, because they don't have any backward compatibility
>>> guarantees.
>>>>>
>>>>> Hence, I would suggest that the corresponding classes go into a new
>>>>> package `org.apache.kafka.streams.state`.
>>>>>
>>>>>
>>>>> -Matthias
>>>>>
>>>>>
>>>>> On 4/9/19 8:58 PM, Bruno Cadonna wrote:
>>>>>> Hi Yishun,
>>>>>>
>>>>>> Thank you for the KIP.
>>>>>>
>>>>>> I have a couple of comments:
>>>>>>
>>>>>> 1. Could you please add an example to the KIP that demonstrates how
>>> the
>>>>>> mocks should be used in a test?
>>>>>>
>>>>>> 2. I am wondering, whether the MockKeyValueStore needs to be backed
>>> by an
>>>>>> actual KeyValueStore (in your KIP InMemoryKeyValueStore). Would it
>> not
>>>>>> suffice to provide the mock with the entries that it has to check in
>>> case
>>>>>> of input operation like put() and with the entries it has to return
>>> in case
>>>>>> of an output operation like get()? In my opinion, a mock should have
>>> as
>>>>>> little and as simple code as possible. A unit test should depend as
>>> little
>>>>>> as possible from productive code that it does not explicitly test.
>>>>>>
>>>>>> 3. I would be interested in the arguments against using a
>>> well-established
>>>>>> and well-tested mock framework like EasyMock. If there are good
>>> arguments,
>>>>>> they should be listed under 'Rejected Alternatives'.
>>>>>>
>>>>>> 3. What is the purpose of the parameter 'time' in MockStoreFactory?
>>>>>>
>>>>>> Best,
>>>>>> Bruno
>>>>>>
>>>>>> On Tue, Apr 9, 2019 at 11:29 AM Sophie Blee-Goldman <
>>> sop...@confluent.io>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Yishun, thanks for the KIP! I have a few initial
>>> questions/comments:
>>>>>>>
>>>>>>> 1) It may be useful to capture the iterator results as well (eg
>> with
>>> a
>>>>>>> MockIterator that wraps the underlying iterator and records the
>> same
>>> way
>>>>>>> the MockStore wraps/records the underlying store)
>>>>>>>
>>>>>>> 2) a. Where is the "persistent" variable coming from or being used?
>>> It
>>>>>>> seems the MockKeyValueStore accepts it in the constructor, but only
>>> the
>>>>>>> name parameter is passed when constructing a new MockKeyValueStore
>> in
>>>>>>> build() ... also, if we extend InMemoryXXXStore shouldn't this
>>> always be
>>>>>>> false?
>>>>>>>     b. Is the idea to wrap an in-memory store for each type
>>> (key-value,
>>>>>>> session, etc)? We don't (yet) offer an in-memory version of the
>>> session
>>>>>>> store although it is in the works, so this will be possible -- I am
>>> more
>>>>>>> wondering if it makes sense to decide this for the user or to allow
>>> them to
>>>>>>> choose between in-memory or rocksDB by setting "persistent"
>>>>>>>
>>>>>>> 3) I'm wondering if users might want to be able to plug in their
>> own
>>> custom
>>>>>>> stores as the underlying backend...should we support this as well?
>>> WDYT?
>>>>>>>
>>>>>>> 4) We probably want to make these stores available through the
>> public
>>>>>>> test-utils package (maybe not the stores themselves which should be
>>>>>>> internal, but should there be some kind of public API that gives
>>> access to
>>>>>>> them?)
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Sophie
>>>>>>>
>>>>>>> On Tue, Apr 9, 2019 at 9:19 AM Yishun Guan <gyis...@gmail.com>
>>> wrote:
>>>>>>>
>>>>>>>> Bumping this up again, thanks!
>>>>>>>>
>>>>>>>> On Fri, Apr 5, 2019, 14:36 Yishun Guan <gyis...@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Hi, bumping this up again. Thanks!
>>>>>>>>>
>>>>>>>>> On Tue, Apr 2, 2019, 13:07 Yishun Guan <gyis...@gmail.com>
>> wrote:
>>>>>>>>>
>>>>>>>>>> Hi All,
>>>>>>>>>>
>>>>>>>>>> I like to start a discussion on KIP-448
>>>>>>>>>> (https://cwiki.apache.org/confluence/x/SAeZBg). It is about
>>> adding
>>>>>>>>>> Mock state stores and relevant components for testing purposes.
>>>>>>>>>>
>>>>>>>>>> Here is the JIRA:
>>> https://issues.apache.org/jira/browse/KAFKA-6460
>>>>>>>>>>
>>>>>>>>>> This is a rough KIP draft, review and comment are appreciated.
>> It
>>>>>>>>>> seems to be tricky and some requirements and details are still
>>> needed
>>>>>>>>>> to be discussed.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Yishun
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to