Commit d81ae2f0 authored by Abseil Team's avatar Abseil Team Committed by Copybara-Service
Browse files

Clarify "package" means "Bazel package", and promote `testonly=True` rather...

Clarify "package" means "Bazel package", and promote `testonly=True` rather than `testing` sub-directory.

PiperOrigin-RevId: 417945818
Change-Id: I8686ee0414fb80269528677f291877a231d1c991
parent c58f562f
......@@ -190,12 +190,12 @@ Some people put it in a `_test.cc`. This is fine when the interface being mocked
`Foo` changes it, your test could break. (You can't really expect `Foo`'s
maintainer to fix every test that uses `Foo`, can you?)
So, the rule of thumb is: if you need to mock `Foo` and it's owned by others,
define the mock class in `Foo`'s package (better, in a `testing` sub-package
such that you can clearly separate production code and testing utilities), put
it in a `.h` and a `cc_library`. Then everyone can reference them from their
tests. If `Foo` ever changes, there is only one copy of `MockFoo` to change, and
only tests that depend on the changed methods need to be fixed.
Generally, you should not define mock classes you don't own. If you must mock
such a class owned by others, define the mock class in `Foo`'s Bazel package
(usually the same directory or a `testing` sub-directory), and put it in a `.h`
and a `cc_library` with `testonly=True`. Then everyone can reference them from
their tests. If `Foo` ever changes, there is only one copy of `MockFoo` to
change, and only tests that depend on the changed methods need to be fixed.
Another way to do it: you can introduce a thin layer `FooAdaptor` on top of
`Foo` and code to this new interface. Since you own `FooAdaptor`, you can absorb
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment