I am working with the following system:
Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern
We recently had an issue where I updated the version of the library I was using, which, among other things, caused timestamps (which the third party library returns as long
), to be changed from milliseconds after the epoch to nanoseconds after the epoch.
The Problem:
If I write tests that mock the third party library's objects, my test will be wrong if I have made a mistake about the third party library's objects. For example, I didn't realize that the timestamps changed precision, which resulted in a need for change in the unit test, because my mock returned the wrong data. This is not a bug in the library, it happened because I missed something in the documentation.
The problem is, I cannot be sure about the data contained in these data structures because I cannot generate real ones without a real data feed. These objects are big and complicated and have a lot of different pieces of data in them. The documentation for the third party library is poor.
The Question:
How can I set up my tests to test this behavior? I'm not sure I can solve this issue in a unit test, because the test itself can easily be wrong. Additionally, the integrated system is large and complicated and it's easy to miss something. For example, in the situation above, I had correctly adjusted the timestamp handling in several places, but I missed one of them. The system seemed to be doing mostly the right things in my integration test, but when I deployed it to production (which has a lot more data), the problem became obvious.
I do not have a process for my integration tests right now. Testing is essentially: try to keep the unit tests good, add more tests when things break, then deploy to my test server and make sure things seem sane, then deploy to production. This timestamp issue passed the unit tests because the mocks were created wrong, then it passed the integration test because it didn't cause any immediate, obvious problems. I do not have a QA department.
Timestamp
class (containing any representation they want) and provide named methods (.seconds()
,.milliseconds()
,.microseconds()
,.nanoseconds()
) and of course named constructors. Then there would have been no issues.